使用分页库更新单个元素的最佳方式
Best way to update a single element using Paging Library
使用新的分页库时更新单个元素的最佳方式是什么?
假设我们有 Paging with network google 样本使用 PageKeyedSubredditDataSource
。想象一下,我们想要更改 RedditPost
的单个元素。所以,我们要检查它是否在列表中,如果是,更新它。更新不应该像调用 invalidate() 那样简单,它会调用第一页(也许 RedditPost 在第 5 页。我们不想更新所有元素,只更新一个元素)。
请注意,所有这些都适用于 Paging with network google 示例。话虽如此,想法还是有的。
@Sarquella 帮我解决了这个问题。将此 classes 添加到您的项目中。基本上我们将 ViewHolder
扩展为 LifeCycle Owner
,因为默认情况下 Activities
和 Fragments
已经完成了。
LifecycleViewHolder
:
abstract class LifecycleViewHolder(itemView: View) :
RecyclerView.ViewHolder(itemView),
LifecycleOwner {
private val lifecycleRegistry = LifecycleRegistry(this)
fun onAttached() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
fun onDetached() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
}
override fun getLifecycle(): Lifecycle = lifecycleRegistry
}
LifecycleOwner
是一个单一的方法接口,表示class有一个Lifecycle
。您可以找到更多信息 here.
LifecyclePagedListAdapter
:
abstract class LifecyclePagedListAdapter<T, VH : LifecycleViewHolder>(diffCallback: DiffUtil.ItemCallback<T>) :
PagedListAdapter<T, VH>(diffCallback) {
override fun onViewAttachedToWindow(holder: VH) {
super.onViewAttachedToWindow(holder)
holder.onAttached()
}
override fun onViewDetachedFromWindow(holder: VH) {
super.onViewDetachedFromWindow(holder)
holder.onDetached()
}
}
LifecycleAdapter
(如果你需要的话):
abstract class LifecycleAdapter<VH : LifecycleViewHolder> :
RecyclerView.Adapter<VH>() {
override fun onViewAttachedToWindow(holder: VH) {
super.onViewAttachedToWindow(holder)
holder.onAttached()
}
override fun onViewDetachedFromWindow(holder: VH) {
super.onViewDetachedFromWindow(holder)
holder.onDetached()
}
}
然后,将 MyAdapter
扩展为 LifecyclePagedListAdapter<MyEntity, LifecycleViewHolder>(MY_COMPARATOR)
,将 MyViewHolder
扩展为 LifecycleViewHolder(view)
。您必须相应地根据我们所做的更改完成您的 classes。现在我们可以观察 MyViewHolder
class 上的 liveData
对象。所以我们可以将其添加到 MyViewHolder
class (假设您正在使用依赖注入)。基本上,我们将对 Fragments
或 Activities
:
做同样的事情
private lateinit var myViewModel: MyViewModel
init {
(itemView.context as? AppCompatActivity)?.let{
myViewModel = ViewModelProviders.of(it).get(MyViewModel::class.java)
}
}
然后,在 bind()
方法中:
fun bind(myCell: MyEntity?) {
myViewModel.myLiveData.observe(this, Observer {
// Buala!! Check if it is the cell you want to change and update it.
if (it != null && myCell != null && it.id == myCell.id) {
updateCell(it)
}
})
}
使用新的分页库时更新单个元素的最佳方式是什么?
假设我们有 Paging with network google 样本使用 PageKeyedSubredditDataSource
。想象一下,我们想要更改 RedditPost
的单个元素。所以,我们要检查它是否在列表中,如果是,更新它。更新不应该像调用 invalidate() 那样简单,它会调用第一页(也许 RedditPost 在第 5 页。我们不想更新所有元素,只更新一个元素)。
请注意,所有这些都适用于 Paging with network google 示例。话虽如此,想法还是有的。
@Sarquella 帮我解决了这个问题。将此 classes 添加到您的项目中。基本上我们将 ViewHolder
扩展为 LifeCycle Owner
,因为默认情况下 Activities
和 Fragments
已经完成了。
LifecycleViewHolder
:
abstract class LifecycleViewHolder(itemView: View) :
RecyclerView.ViewHolder(itemView),
LifecycleOwner {
private val lifecycleRegistry = LifecycleRegistry(this)
fun onAttached() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
fun onDetached() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
}
override fun getLifecycle(): Lifecycle = lifecycleRegistry
}
LifecycleOwner
是一个单一的方法接口,表示class有一个Lifecycle
。您可以找到更多信息 here.
LifecyclePagedListAdapter
:
abstract class LifecyclePagedListAdapter<T, VH : LifecycleViewHolder>(diffCallback: DiffUtil.ItemCallback<T>) :
PagedListAdapter<T, VH>(diffCallback) {
override fun onViewAttachedToWindow(holder: VH) {
super.onViewAttachedToWindow(holder)
holder.onAttached()
}
override fun onViewDetachedFromWindow(holder: VH) {
super.onViewDetachedFromWindow(holder)
holder.onDetached()
}
}
LifecycleAdapter
(如果你需要的话):
abstract class LifecycleAdapter<VH : LifecycleViewHolder> :
RecyclerView.Adapter<VH>() {
override fun onViewAttachedToWindow(holder: VH) {
super.onViewAttachedToWindow(holder)
holder.onAttached()
}
override fun onViewDetachedFromWindow(holder: VH) {
super.onViewDetachedFromWindow(holder)
holder.onDetached()
}
}
然后,将 MyAdapter
扩展为 LifecyclePagedListAdapter<MyEntity, LifecycleViewHolder>(MY_COMPARATOR)
,将 MyViewHolder
扩展为 LifecycleViewHolder(view)
。您必须相应地根据我们所做的更改完成您的 classes。现在我们可以观察 MyViewHolder
class 上的 liveData
对象。所以我们可以将其添加到 MyViewHolder
class (假设您正在使用依赖注入)。基本上,我们将对 Fragments
或 Activities
:
private lateinit var myViewModel: MyViewModel
init {
(itemView.context as? AppCompatActivity)?.let{
myViewModel = ViewModelProviders.of(it).get(MyViewModel::class.java)
}
}
然后,在 bind()
方法中:
fun bind(myCell: MyEntity?) {
myViewModel.myLiveData.observe(this, Observer {
// Buala!! Check if it is the cell you want to change and update it.
if (it != null && myCell != null && it.id == myCell.id) {
updateCell(it)
}
})
}