【发布时间】:2019-07-22 14:11:17
【问题描述】:
我有一个活动,它实例化一个片段 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()
}
}
这是道查询:
@Query(Select * from users)
abstract fun getUsers(): DataSource.Factory<Int, User>
users 表有许多字段,例如 name 、 phonenumber 、 status 、 location 等。
我继续从后台更新表格。
我希望我的片段加载一次数据,当我删除观察者时,它不应该得到任何数据库更改的更新。
但问题是第一次,当我加载片段时,数据被加载到列表中,dataChanged 被调用。并且观察者被移除。
但是当一些数据库更改发生时,我的用户列表会不断更新。
【问题讨论】: