Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android DiffUtil问题:旧列表和新列表是相同的_Android_Kotlin_Android Recyclerview_Android Diffutils - Fatal编程技术网

Android DiffUtil问题:旧列表和新列表是相同的

Android DiffUtil问题:旧列表和新列表是相同的,android,kotlin,android-recyclerview,android-diffutils,Android,Kotlin,Android Recyclerview,Android Diffutils,上下文: MainActivity启动,创建ItemObject的列表,并调用ListFragment。当用户单击按钮(位于main活动)时,它会修改列表,然后调用listFragment对其进行更新 发现的问题: 在listFragment上的update功能中,newList和oldList是相同的 这是我的密码 main活动 class MainActivity : AppCompatActivity() { private val viewModel = MainViewMod

上下文:
MainActivity
启动,创建
ItemObject
的列表,并调用
ListFragment
。当用户单击
按钮
(位于
main活动
)时,它会修改列表,然后调用
listFragment
对其进行更新

发现的问题:
listFragment
上的
update
功能中,
newList
oldList
是相同的

这是我的密码

main活动

class MainActivity : AppCompatActivity() {

    private val viewModel = MainViewModel()

    private var button : FloatingActionButton? = null

    private val listFragment = ListFragment.newInstance()

    var list = ArrayList<ItemObject>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        binding.viewModel = viewModel

        button = binding.button
        button?.setOnClickListener { modifyList() }

        createItemsList()
    }

    /**
     *  This creates a list of 10 ItemObject, that will contains `i` as `randomInt` and "TEST $i" as `title`, then call
     *  setListFragment().
     */
    private fun createItemsList() {
        val itemsList = ArrayList<ItemObject>()
        var i = 0
        while (i < 10) {
            itemsList.add(ItemObject().apply { this.randomInt = i ; this.title = "TEST $i" })
            i++
        }
        list = itemsList
        setListFragment()
    }

    /**
     *  Set listFragment inside content.
     */
    private fun setListFragment() {
        supportFragmentManager.beginTransaction().replace(R.id.content, listFragment).commit()
    }

    /**
     *  Triggered when the user clicks on the FloatingActionButton. Will modify each even item, add 2 to its `randomInt`
     *  and set its `title` to "MODIFIED $randomInt".
     */
    private fun modifyList() {
        list.forEach {
            if (it.randomInt % 2 == 0) {
                it.randomInt += 2
                it.title = "MODIFIED ${it.randomInt}"
            }
        }
        if (listFragment.isAdded) {
            listFragment.updateList(list)
        }
    }

    inner class MainViewModel
}
这是我的
ItemObject
类:

class ItemObject {

    var title = ""
    var randomInt = 0
}

奇怪的是,我从未在
ListFragment
中修改我的列表。那么,当列表更新时,我的调试println怎么可能向我显示旧列表和新列表是相同的呢?

你能试着举一个简单的例子来重现这个问题吗?我怀疑当这个例子如此之大的时候,你会得到多少帮助。你的ItemObject类是什么样子的?@marstran实际上我制作了整个应用程序只是为了测试这个问题。。。在最初的应用程序中,解释起来要大得多。@r2rek我已经编辑了我的问题,但我怀疑这是否有用:问题不在于对象,而在于两个列表似乎同时更新。如果这是旧消息,很抱歉,但看起来您在列表上“通过引用传递”。因此,要修改的列表与用于传递给适配器的列表相同。您希望在内存中创建两个完全独立的列表,以便DiffUtil正常工作。这很容易被忽视,我以前也做过。
class ItemObject {

    var title = ""
    var randomInt = 0
}