Android recycleview在数据更新时正在复制

Android recycleview在数据更新时正在复制,android,android-recyclerview,android-livedata,Android,Android Recyclerview,Android Livedata,在main活动中,我: lateinit var adapter: ChapterAdapter class MainActivity : AppCompatActivity() { userViewModel = ViewModelProviders.of(this).get(UserViewModel::class.java) userViewModel.allUsers.observe(this, Observer { users -> users?.le

main活动中
,我:

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

    }
}
一章中,我已经:

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

    }
}
我的
存储库是:

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)
    }
}
import androidx.annotation.WorkerThread
导入androidx.lifecycle.LiveData
类UserRepository(私有val userDao:userDao){
val alluser:LiveData=userDao.getAll()
@工作线程
趣味插页(用户:用户){
userDao.insertAll(用户)
}
@工作线程
趣味更新(id:Int,name:String){
userDao.updateById(id,名称)
}
}

在插入时,recycleView正在正确更新,但在项目更改时,它正在复制所有内容,即,
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)
             }
         }
   })

检查我们的答案,希望有帮助:)