【问题标题】:DiffCallBack Isn't Getting Called?DiffCallBack 没有被调用?
【发布时间】:2021-01-08 14:26:56
【问题描述】:

所以,我有一个 ListAdapter,我每次都使用 adapter.submitList() 在我的适配器中传递新列表,但奇怪的是它只第一次提交列表,而下一次它只是不显示适配器内的项目 这是我提交列表的方式

 private fun insertListToRv() {
        val mName = editText_checkbox.text.toString()
        val isChecked = false

        if (mName == "") {
            Toast.makeText(requireContext(), "Please fill out all fields.", Toast.LENGTH_SHORT)
                .show()
        } else {

            val newListData = TaskList(
                mName,
                isChecked,
                0,
                mNoteId
            )
            itemList.add(newListData)
            adapter.submitList(itemList)
            Log.d("TAG2","Current List: ${adapter.currentList}")
            counter++
            editText_checkbox.setText("")
        }


    }

这里itemList是一个全局变量,初始化为ArrayList()

var itemList: MutableList<TaskList> = ArrayList()

我什至在我的 DiffCallBack 中放置了一些日志语句,在这种情况下它只被调用一次,之后它根本不会被调用。 这是我的 DiffCallBack 类

class DiffCallBack(
) : DiffUtil.ItemCallback<TaskList>() {
    override fun areItemsTheSame(oldItem: TaskList, newItem: TaskList): Boolean {
        Log.d("TAG3","Inside")
        return oldItem.Taskid == newItem.Taskid

    }

    override fun areContentsTheSame(oldItem: TaskList, newItem: TaskList): Boolean {
        Log.d("TAG3","Inside")
        return oldItem == newItem

    }


}

我还调试了我的代码,并注意到我的 adapter.currentList 正在更新。 这个实现可能有什么问题?

【问题讨论】:

  • 你能分享你正在测试的代码吗?
  • 只是好奇你有没有尝试我的答案?
  • 是的,它有效,但必须解决其他问题才能正常工作

标签: java android kotlin mvvm android-livedata


【解决方案1】:

看来问题可能会重复使用同一个列表

val newListData = TaskList(
                mName,
                isChecked,
                0,
                mNoteId
            )
       val adapterList = itemList + newListData
       adapter.submitList(adapterList)

【讨论】:

  • 我试过这个,但这只是不断更改列表中的相同项目,例如 - 如果我输入 abc 作为第一个列表项目,然后你好,它只是用你好替换它 abc
  • TaskList(mName, isChecked, 0, mNoteId) mNoteId0(零)始终相同。如果其中任何一个是Taskid,那就是你的问题,因为return oldItem.Taskid == newItem.Taskid
【解决方案2】:

试试这样:

    if (mName == "") {
        Toast.makeText(requireContext(), "Please fill out all fields.", Toast.LENGTH_SHORT)
            .show()
    } else {

        val newListData = TaskList(
            mName,
            isChecked,
            0,
            mNoteId
        )
        itemList.add(newListData)
        adapter.submitList(itemList)

        //I have added this line code
        adapter.notifyDataSetChanged()

        Log.d("TAG2","Current List: ${adapter.currentList}")
        counter++
        editText_checkbox.setText("")
    }

我在堆栈溢出的某个地方读过,我不记得在哪里。为了以您的方式使用 DiffCallBack,您还必须实现 ROOM!所以要注意这一点!否则你必须创建一个定制的 DiffCallBack。所以不要浪费你的时间 :) 我已经在我自己的项目中失去了几个小时的时间。您可以使用我上面的答案。如果你想要动画,你必须指定插入、删除等项目的范围......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2019-03-31
    • 2012-12-16
    • 2015-03-28
    相关资源
    最近更新 更多