使用Paging Library更新单个元素的最佳方法

时间:2018-05-31 00:58:03

标签: android android-architecture-components android-paging android-livedata

使用新的分页库时,哪种更新单个元素的最佳方法是什么?

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

1 个答案:

答案 0 :(得分:0)

请注意,所有这些操作都适用于Paging with network Google示例。尽管如此,这个想法就在那里。

@Sarquella帮助我解决了这个问题。将此类添加到您的项目。基本上,我们将$roleid=$this->session->userdata('roleid'); 扩展为ViewHolder,因为默认情况下已经使用LifeCycle OwnerActivities完成了此操作。

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。您可以找到更多信息here

Lifecycle

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)类上的liveData对象。因此,我们可以将其添加到MyViewHolder类中(假设您使用的是依赖注入)。基本上,我们将对MyViewHolderFragments做同样的事情:

Activities

然后,在private lateinit var myViewModel: MyViewModel init { (itemView.context as? AppCompatActivity)?.let{ myViewModel = ViewModelProviders.of(it).get(MyViewModel::class.java) } } 方法内部:

bind()