簡體   English   中英

使用 DiffUtil 刪除舊的更新列表到 recyclerview 適配器?

[英]update list to recyclerview adapter with DiffUtil removing the old one?

我正在為我的 RecyclerView 使用 DiffUtil,它適用於一個加載列表,但是當嘗試使用它來將新列表更新為當前列表時,它會刪除舊數據,這是我的適配器

class SettingRecyclerView(private val interaction: Interaction? = null) :
    RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    val DIFF_CALLBACK = object : DiffUtil.ItemCallback<SettingItem>() {

        override fun areItemsTheSame(oldItem: SettingItem, newItem: SettingItem): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: SettingItem, newItem: SettingItem): Boolean {
            return oldItem.hashCode() == newItem.hashCode()
        }

    }
    private val differ = AsyncListDiffer(this, DIFF_CALLBACK)


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {

        return SettingViewHolder(
            ItemRvBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            ),
            interaction
        )
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is SettingViewHolder -> {
                holder.bind(differ.currentList.get(position))
            }
        }
    }

    override fun getItemCount(): Int {
        return differ.currentList.size
    }

    fun submitList(list: List<SettingItem>) {
        differ.submitList(list)
    }

    class SettingViewHolder
    constructor(
        private val binding: ItemRvBinding,
        private val interaction: Interaction?
    ) : RecyclerView.ViewHolder(binding.root) {

        fun bind(item: SettingItem) = with(binding.root) {
            binding.root.setOnClickListener {
                interaction?.onItemSelected(adapterPosition, item)
            }

            binding.settingTitle.text = item.title

        }
    }

    interface Interaction {
        fun onItemSelected(position: Int, item: SettingItem)
    }
}

這是我在我的活動中更新列表的方法

lateinit var mAdapter: SettingRecyclerView

mAdapter.submitList(settings)

我不知道究竟是什么問題導致了這個問題,還有其他方法可以使用 DiffUtil 更新列表,或者我必須使用 notifiydatachanged 還是什么?

如果您不使用data class它將導致問題。

問題是您正在比較areContentsTheSame()方法中的SettingItem.hashCode()

override fun areContentsTheSame(oldItem: SettingItem, newItem: SettingItem): Boolean {
    \\ You need to pass the same object to evaluate to true.
    return oldItem.hashCode() == newItem.hashCode()
}

解決方案:

您需要以正確的方式使用data class ,以便編譯器自動從主構造函數中聲明的所有屬性派生hashCode()equals()

看到這個:數據類

或者您應該手動比較SettingsItem的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM