diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt index f58ccca72..89111c90a 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt @@ -7,7 +7,6 @@ import android.view.MenuItem import android.view.View import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog -import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.textfield.TextInputLayout @@ -17,6 +16,7 @@ import io.legado.app.constant.AppConst.charsets import io.legado.app.constant.AppLog import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction +import io.legado.app.data.AppDatabase import io.legado.app.data.appDb import io.legado.app.data.entities.Book import io.legado.app.data.entities.BookChapter @@ -41,6 +41,7 @@ import io.legado.app.utils.applyTint import io.legado.app.utils.checkWrite import io.legado.app.utils.cnCompare import io.legado.app.utils.enableCustomExport +import io.legado.app.utils.flowWithLifecycleAndDatabaseChange import io.legado.app.utils.isContentScheme import io.legado.app.utils.observeEvent import io.legado.app.utils.parseToUri @@ -221,7 +222,9 @@ class CacheActivity : VMBaseActivity() else -> booksDownload.sortedByDescending { it.durChapterTime } } - }.flowWithLifecycle(lifecycle).catch { + }.flowWithLifecycleAndDatabaseChange( + lifecycle, table = AppDatabase.BOOK_TABLE_NAME + ).catch { AppLog.put("缓存管理界面获取书籍列表失败\n${it.localizedMessage}", it) }.flowOn(IO).conflate().collect { books -> adapter.setItems(books) diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt index 8bae73e3f..5d3049440 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt @@ -5,9 +5,10 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView +import androidx.recyclerview.widget.DiffUtil import io.legado.app.R +import io.legado.app.base.adapter.DiffRecyclerAdapter import io.legado.app.base.adapter.ItemViewHolder -import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemDownloadBinding import io.legado.app.help.book.isLocal @@ -16,7 +17,20 @@ import io.legado.app.utils.gone import io.legado.app.utils.visible class CacheAdapter(context: Context, private val callBack: CallBack) : - RecyclerAdapter(context) { + DiffRecyclerAdapter(context) { + + override val diffItemCallback: DiffUtil.ItemCallback + get() = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Book, newItem: Book): Boolean { + return oldItem.bookUrl == newItem.bookUrl + } + + override fun areContentsTheSame(oldItem: Book, newItem: Book): Boolean { + return oldItem.name == newItem.name + && oldItem.author == newItem.author + } + + } override fun getViewBinding(parent: ViewGroup): ItemDownloadBinding { return ItemDownloadBinding.inflate(inflater, parent, false) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 953c3117b..1445c6ec0 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -16,7 +16,6 @@ import androidx.core.os.bundleOf import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.ItemTouchHelper @@ -25,6 +24,7 @@ import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppLog import io.legado.app.constant.EventBus +import io.legado.app.data.AppDatabase import io.legado.app.data.appDb import io.legado.app.data.entities.BookSourcePart import io.legado.app.databinding.ActivityBookSourceBinding @@ -52,7 +52,8 @@ import io.legado.app.utils.ACache import io.legado.app.utils.applyTint import io.legado.app.utils.cnCompare import io.legado.app.utils.dpToPx -import io.legado.app.utils.flowWithLifecycleFirst +import io.legado.app.utils.flowWithLifecycleAndDatabaseChange +import io.legado.app.utils.flowWithLifecycleAndDatabaseChangeFirst import io.legado.app.utils.hideSoftInput import io.legado.app.utils.isAbsUrl import io.legado.app.utils.launch @@ -376,7 +377,10 @@ class BookSourceActivity : VMBaseActivity data.reversed() } } - }.flowWithLifecycle(lifecycle).catch { + }.flowWithLifecycleAndDatabaseChange( + lifecycle, + table = AppDatabase.BOOK_SOURCE_TABLE_NAME + ).catch { AppLog.put("书源界面更新书源出错", it) }.flowOn(IO).conflate().collect { data -> adapter.setItems(data, adapter.diffItemCallback, !Debug.isChecking) @@ -389,8 +393,14 @@ class BookSourceActivity : VMBaseActivity(R.layout.fragment_exp AppDatabase.BOOK_SOURCE_TABLE_NAME ) .conflate() + .distinctUntilChanged() .collect { groups.clear() groups.addAll(it)