我有一个活动,该活动将片段B实例化。片段B显示了一个用户列表。我从DB作为LiveData获取。我向实时数据添加了一个观察者。每当调用onChanged时,我都会删除观察者。
但是无论何时数据库更改,onChanged
都会被反复调用。
这是片段类的代码:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initRecyclerViews()
viewModel.liveResult = viewModel.getAllUsers()
observeData()
}
fun observeData() {
viewModel.liveResults?.observe(this@UserFragment, Observer(allUserAdapter::submitList))
viewModel.liveResults?.observe(this@UserFragment, observer)
}
val observer: Observer<PagedList<User>> = object : Observer<PagedList<User>> {
override fun onChanged(t: PagedList<User>?) {
dataChanged()
}
}
fun dataChanged() {
// do some work
viewModel.liveResults?.removeObservers(this@UserFragment)
}
下面是适配器类的代码:
class AllUsersAdapter(
private val inflater: LayoutInflater) :
PagedListAdapter<User, MyViewHolder>(diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AllUsersItemViewHolder {
return MyViewHolder(
inflater.inflate(R.layout.user_item, parent, false))
}
override fun onBindViewHolder(holder: AllUsersItemViewHolder, position: Int) {
holder.setItem(getItem(position))
}
companion object {
private val diffCallback = object : DiffUtil.ItemCallback<User>() {
override fun areItemsTheSame(oldItem: User, newItem: User): Boolean {
val ret = oldItem.phonenumber == newItem.phonenumber
return ret
}
override fun areContentsTheSame(oldItem: User, newItem: User): Boolean {
val ret = oldItem.phonenumber == newItem.phonenumber
return ret
}
}
}
}
这是viewmodel的代码:
class MyViewModel : BaseViewModel() {
lateinit var mUsersList: LiveData<PagedList<MaxwellUser>>
fun getAllUsers() {
val factory = dao.getUsers()
liveResults = LivePagedListBuilder(factory,
PagedList.Config.Builder()
.setPageSize(Constant.PAGE_SIZE)
.setEnablePlaceholders(true)
.build()).build()
}
}
这是Dao查询:
@Query(Select * from users)
abstract fun getUsers(): DataSource.Factory<Int, User>
users表具有许多字段,例如名称,电话号码,状态,位置等。
我不断从后台更新表格。
我希望我的片段一次加载数据,并且当我删除观察者时,它不应获得数据库更改的任何更新。
但是问题是第一次,当我加载片段时,数据被加载到列表中,dataChanged
被调用。观察员被撤职。
但是当某些数据库发生更改时,我的用户列表仍在不断更新。
答案 0 :(得分:0)
您为什么两次观察列表?
viewModel.liveResults?.observe(this@UserFragment, Observer(allUserAdapter::submitList))
viewModel.liveResults?.observe(this@UserFragment, observer)
您可以使用dataChanged
方法将列表提交给适配器。