From 09693fde73e857247f49f36daea722efe2ff608a Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Tue, 21 Feb 2023 21:55:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/base/adapter/RecyclerAdapter.kt | 28 +++++++++++++------ .../app/ui/dict/rule/DictRuleViewModel.kt | 10 ++++--- app/src/main/res/layout/dialog_dict.xml | 4 ++- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt index 11e0e4d12..9043f679a 100644 --- a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt @@ -9,6 +9,9 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding +import io.legado.app.help.coroutine.Coroutine +import io.legado.app.utils.buildMainHandler +import kotlinx.coroutines.ensureActive import splitties.views.onLongClick import java.util.* @@ -31,6 +34,8 @@ abstract class RecyclerAdapter(protected val context: Co private var itemClickListener: ((holder: ItemViewHolder, item: ITEM) -> Unit)? = null private var itemLongClickListener: ((holder: ItemViewHolder, item: ITEM) -> Boolean)? = null + private var diffJob: Coroutine<*>? = null + var itemAnimation: ItemAnimation? = null fun setOnItemClickListener(listener: (holder: ItemViewHolder, item: ITEM) -> Unit) { @@ -139,15 +144,21 @@ abstract class RecyclerAdapter(protected val context: Co return itemCallback.getChangePayload(oldItem, newItem) } } - val diffResult = DiffUtil.calculateDiff(callback) - if (this.items.isNotEmpty()) { - this.items.clear() + diffJob?.cancel() + diffJob = Coroutine.async { + val diffResult = DiffUtil.calculateDiff(callback) + ensureActive() + handler.post { + if (this@RecyclerAdapter.items.isNotEmpty()) { + this@RecyclerAdapter.items.clear() + } + if (items != null) { + this@RecyclerAdapter.items.addAll(items) + } + diffResult.dispatchUpdatesTo(this@RecyclerAdapter) + onCurrentListChanged() + } } - if (items != null) { - this.items.addAll(items) - } - diffResult.dispatchUpdatesTo(this) - onCurrentListChanged() } } @@ -449,6 +460,7 @@ abstract class RecyclerAdapter(protected val context: Co companion object { private const val TYPE_HEADER_VIEW = Int.MIN_VALUE private const val TYPE_FOOTER_VIEW = Int.MAX_VALUE - 999 + private val handler by lazy { buildMainHandler() } } } diff --git a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt index ccf040799..e3f8bdbe1 100644 --- a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt @@ -15,8 +15,9 @@ class DictRuleViewModel(application: Application) : BaseViewModel(application) { execute { appDb.dictRuleDao.update(*dictRule) }.onError { - AppLog.put(it.localizedMessage, it) - context.toastOnUi(it.localizedMessage) + val msg = "更新字典规则出错\n${it.localizedMessage}" + AppLog.put(msg, it) + context.toastOnUi(msg) } } @@ -24,8 +25,9 @@ class DictRuleViewModel(application: Application) : BaseViewModel(application) { execute { appDb.dictRuleDao.delete(*dictRule) }.onError { - AppLog.put(it.localizedMessage, it) - context.toastOnUi(it.localizedMessage) + val msg = "删除字典规则出错\n${it.localizedMessage}" + AppLog.put(msg, it) + context.toastOnUi(msg) } } diff --git a/app/src/main/res/layout/dialog_dict.xml b/app/src/main/res/layout/dialog_dict.xml index 4ad8424ce..81c78815e 100644 --- a/app/src/main/res/layout/dialog_dict.xml +++ b/app/src/main/res/layout/dialog_dict.xml @@ -9,14 +9,16 @@ android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingBottom="16dp" app:layout_constraintTop_toTopOf="parent" tools:ignore="SpeakableTextPresentCheck" /> -