Horis 2 年 前
親
コミット
8484e25277

+ 5 - 2
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<ActivityCacheBookBinding, CacheViewModel>()
 
                     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)

+ 16 - 2
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<Book, ItemDownloadBinding>(context) {
+    DiffRecyclerAdapter<Book, ItemDownloadBinding>(context) {
+
+    override val diffItemCallback: DiffUtil.ItemCallback<Book>
+        get() = object : DiffUtil.ItemCallback<Book>() {
+            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)

+ 15 - 5
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<ActivityBookSourceBinding, BookSourceV
                         else -> 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<ActivityBookSourceBinding, BookSourceV
     private fun initLiveDataGroup() {
         lifecycleScope.launch {
             appDb.bookSourceDao.flowGroups()
-                .flowWithLifecycle(lifecycle)
-                .flowWithLifecycleFirst(groupMenuLifecycleOwner.lifecycle)
+                .flowWithLifecycleAndDatabaseChange(
+                    lifecycle,
+                    table = AppDatabase.BOOK_SOURCE_TABLE_NAME
+                )
+                .flowWithLifecycleAndDatabaseChangeFirst(
+                    groupMenuLifecycleOwner.lifecycle,
+                    table = AppDatabase.BOOK_SOURCE_TABLE_NAME
+                )
                 .conflate()
                 .distinctUntilChanged()
                 .collect {

+ 2 - 0
app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt

@@ -40,6 +40,7 @@ import kotlinx.coroutines.Job
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.conflate
+import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.launch
 
@@ -134,6 +135,7 @@ class ExploreFragment() : VMBaseFragment<ExploreViewModel>(R.layout.fragment_exp
                     AppDatabase.BOOK_SOURCE_TABLE_NAME
                 )
                 .conflate()
+                .distinctUntilChanged()
                 .collect {
                     groups.clear()
                     groups.addAll(it)