Android recycleview 在数据更新时重复
Android recycleview is duplicating upon data update
在 MainActivity
中,我:
lateinit var adapter: ChapterAdapter
class MainActivity : AppCompatActivity() {
userViewModel = ViewModelProviders.of(this).get(UserViewModel::class.java)
userViewModel.allUsers.observe(this, Observer { users ->
users?.let { it ->
it?.forEach {
val insertIndex = chaptersList.size
chaptersList.add(insertIndex, it.toString())
adapter.notifyItemInserted(insertIndex)
}
}
})
}
在 chapterAdapter
中,我:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.checkBox.setOnCheckedChangeListener { _, b ->
Toast.makeText(context, b.toString(),
Toast.LENGTH_LONG).show()
userViewModel.update(position, "AHasan")
// adapter.notifyDataSetChanged()
adapter.notifyItemChanged(position)
}
}
我的repository
是:
import androidx.annotation.WorkerThread
import androidx.lifecycle.LiveData
class UserRepository(private val userDao: UserDao) {
val allUsers: LiveData<List<User>> = userDao.getAll()
@WorkerThread
fun insert(user: User) {
userDao.insertAll(user)
}
@WorkerThread
fun update(id: Int, name: String) {
userDao.updateById(id, name)
}
}
recycleView 在 insert
时正确更新,但在 ItemChanged
时它正在复制所有内容,即 recycleView
中的所有卡片,如果我关闭应用程序,并且 运行又来了,事情又回到了正确的状态
如果我不得不猜测为什么会发生这种情况,我会说你的 userViewModel.update(position, "AHasan")
正在更新这个观察者:
userViewModel.allUsers.observe(this, Observer { users ->
users?.let { it ->
it?.forEach {
val insertIndex = chaptersList.size
chaptersList.add(insertIndex, it.toString())
adapter.notifyItemInserted(insertIndex)
}
}
})
然后再次添加所有项目。因此,作为建议和可能的解决方法,请尝试在此处清除您的列表:
userViewModel.allUsers.observe(this, Observer { users ->
users?.let { it ->
//try clearing the adapters items here before adding them again
//as John Joe said you can use
chaptersList.clear()
// try updating your adapter here
adapter.notifyDataSetChanged()
it?.forEach {
val insertIndex = chaptersList.size
chaptersList.add(insertIndex, it.toString())
adapter.notifyItemInserted(insertIndex)
}
}
})
在 MainActivity
中,我:
lateinit var adapter: ChapterAdapter
class MainActivity : AppCompatActivity() {
userViewModel = ViewModelProviders.of(this).get(UserViewModel::class.java)
userViewModel.allUsers.observe(this, Observer { users ->
users?.let { it ->
it?.forEach {
val insertIndex = chaptersList.size
chaptersList.add(insertIndex, it.toString())
adapter.notifyItemInserted(insertIndex)
}
}
})
}
在 chapterAdapter
中,我:
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.checkBox.setOnCheckedChangeListener { _, b ->
Toast.makeText(context, b.toString(),
Toast.LENGTH_LONG).show()
userViewModel.update(position, "AHasan")
// adapter.notifyDataSetChanged()
adapter.notifyItemChanged(position)
}
}
我的repository
是:
import androidx.annotation.WorkerThread
import androidx.lifecycle.LiveData
class UserRepository(private val userDao: UserDao) {
val allUsers: LiveData<List<User>> = userDao.getAll()
@WorkerThread
fun insert(user: User) {
userDao.insertAll(user)
}
@WorkerThread
fun update(id: Int, name: String) {
userDao.updateById(id, name)
}
}
recycleView 在 insert
时正确更新,但在 ItemChanged
时它正在复制所有内容,即 recycleView
中的所有卡片,如果我关闭应用程序,并且 运行又来了,事情又回到了正确的状态
如果我不得不猜测为什么会发生这种情况,我会说你的 userViewModel.update(position, "AHasan")
正在更新这个观察者:
userViewModel.allUsers.observe(this, Observer { users ->
users?.let { it ->
it?.forEach {
val insertIndex = chaptersList.size
chaptersList.add(insertIndex, it.toString())
adapter.notifyItemInserted(insertIndex)
}
}
})
然后再次添加所有项目。因此,作为建议和可能的解决方法,请尝试在此处清除您的列表:
userViewModel.allUsers.observe(this, Observer { users ->
users?.let { it ->
//try clearing the adapters items here before adding them again
//as John Joe said you can use
chaptersList.clear()
// try updating your adapter here
adapter.notifyDataSetChanged()
it?.forEach {
val insertIndex = chaptersList.size
chaptersList.add(insertIndex, it.toString())
adapter.notifyItemInserted(insertIndex)
}
}
})