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)
             }
         }
   })