使用分页库更新单个元素的最佳方法

Dam*_*tes 6 android android-livedata android-architecture-components android-paging

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

假设我们有使用的Google 网络示例PageKeyedSubredditDataSource。假设我们要更改的单个元素RedditPost。因此,我们要检查它是否在列表中,如果是,请对其进行更新。更新不应该像调用invalidate()那样简单,后者将调用第一页(也许RedditPost位于第五页。我们不想更新所有元素,仅更新一个元素)。

Dam*_*tes 2

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

@Sarquella 帮助我解决了这个问题。将此类添加到您的项目中。基本上我们正在扩展ViewHolder为 be LifeCycle Owner,因为默认情况下已经用Activitiesand完成了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
}
Run Code Online (Sandbox Code Playgroud)

LifecycleOwner是一个单一方法接口,表示该类具有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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,延伸MyAdapterLifecyclePagedListAdapter<MyEntity, LifecycleViewHolder>(MY_COMPARATOR)MyViewHolderLifecycleViewHolder(view)。您必须根据我们所做的更改相应地完成您的课程。现在我们可以观察类liveData上的对象MyViewHolder。因此我们可以将其添加到MyViewHolder类中(假设您正在使用依赖注入)。基本上,我们将执行与Fragmentsor相同的操作Activities

private lateinit var myViewModel: MyViewModel

init {
    (itemView.context as? AppCompatActivity)?.let{
        myViewModel = ViewModelProviders.of(it).get(MyViewModel::class.java)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在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)
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨,达米亚,请问是否有任何示例代码可以演示所有必要的更改?当我使用bind()方法和updateCell时,我感到迷失。 (2认同)