如何使用体系结构组件分页库停止在回收器视图上闪烁

sle*_*epy 10 android android-architecture-components android-paging

我有一个类似聊天的活动,我使用带有PagedListAdaper的RecyclerView来加载一堆消息.我正在使用PositionalDataSource来加载数据.加载它的自我工作正常但是当我发送消息时,我使我的数据源无效并且列表被重新制作.我的问题是,当它这样做时它会闪烁:

这就是它的样子

我尝试添加setHasStableIds(true)并重写getItemId,它可以在一个简单的适配器上工作,但它似乎在这里不起作用.我似乎也无法将项添加到getCurrentList(),因为它不受支持.此外,我没有使用数据库,只是向服务器发出请求.

所以我的问题是,除了使数据源失效之外,还有更好的方法吗?有没有办法阻止列表在发送消息时闪烁?或者这个图书馆不适合我的聊天活动?

编辑:

我的差异回调

private val DIFF_CALLBACK: DiffCallback<MessageModel> = object : DiffCallback<MessageModel>() {
        override fun areItemsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
                oldMessage.id == newMessage.id


        override fun areContentsTheSame(@NonNull oldMessage: MessageModel, @NonNull newMessage: MessageModel) =
                oldMessage.equals(newMessage)
    }
Run Code Online (Sandbox Code Playgroud)

Edit2我修复了它:

所以我设法通过使用PagedListAdapterHelper并在加载项目后设置它的列表来修复它:

private var mHelper: PagedListAdapterHelper<MessageModel>? = null

init {
    mHelper = PagedListAdapterHelper(this, DIFF_CALLBACK)
    setHasStableIds(true)
}
fun setList(pagedList: PagedList<MessageModel>) {
    pagedList.addWeakCallback(pagedList.snapshot(), object:PagedList.Callback() {
        override fun onChanged(position: Int, count: Int) {

        }

        override fun onInserted(position: Int, count: Int) {
            mHelper?.setList(pagedList)
        }

        override fun onRemoved(position: Int, count: Int) {

        }

    })
}
Run Code Online (Sandbox Code Playgroud)

小智 3

简短的回答:确保同步调用callbackof ,而不将其包装在某种异步成功处理程序中。PositionalDataSource<T>.loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<T> callback)loadInitial

解释:

闪烁可能是由初始加载(即PositionalDataSource<T>.loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<T> callback).

当您这样做时,将会发生以下情况:

您的数据源变得无效,这会导致创建新的数据源PagedList(当使用 创建时LivePagedListBuilder)。这个新创建的分页列表将传递给您的适配器,但它仍然是空的,因为您没有在初始加载中直接调用回调。只要您的回调被调用,这就会导致一个空列表。这最终导致闪烁效应。

  • 我正在同步调用它,它仍然闪烁 (3认同)