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)。这个新创建的分页列表将传递给您的适配器,但它仍然是空的,因为您没有在初始加载中直接调用回调。只要您的回调被调用,这就会导致一个空列表。这最终导致闪烁效应。
| 归档时间: |
|
| 查看次数: |
1734 次 |
| 最近记录: |