gpt4 book ai didi

android - 使用分页库更新单个元素的最佳方式

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:35:54 25 4
gpt4 key购买 nike

在使用新的分页库时更新单个元素的最佳方式是什么?

假设我们有 Paging with network使用 PageKeyedSubredditDataSource 的 google 示例。想象一下,我们想要更改 RedditPost 的单个元素。所以,我们要检查它是否在列表中,如果是,更新它。更新不应该像调用 invalidate() 那样简单,它会调用第一页(也许 RedditPost 在第 5 页。我们不想更新所有元素,只更新一个元素)。

最佳答案

请注意,所有这些都适用于 Paging with network谷歌示例。尽管如此,想法还是存在的。

@Sarquella 帮助我解决了这个问题。将此类添加到您的项目中。基本上我们正在扩展 ViewHolder成为LifeCycle Owner ,因为默认情况下已经完成了 ActivitiesFragments .

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是一个单一的方法接口(interface),表示该类有一个 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()
}
}

然后,扩展MyAdapterLifecyclePagedListAdapter<MyEntity, LifecycleViewHolder>(MY_COMPARATOR)MyViewHolderLifecycleViewHolder(view) .您必须相应地根据我们所做的更改来完成您的类(class)。现在我们可以观察到 liveData MyViewHolder 上的对象类(class)。所以我们可以将它添加到 MyViewHolder类(假设您正在使用依赖注入(inject))。基本上,我们将对 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)
}
})
}

关于android - 使用分页库更新单个元素的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50615225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com