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)
}
}
})
检查我们的答案,希望有帮助:)