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
}