我有一个类似聊天的 Activity ,我在其中使用 RecyclerView 和 PagedListAdaper 来加载一堆消息。我正在使用 PositionalDataSource 来加载数据。加载它自己工作正常但是当我发送消息时,我使我的数据源无效并且列表被重新制作。 我的问题是当它这样做时它会闪烁:
我尝试添加 setHasStableIds(true) 并覆盖 getItemId,这可以在简单的适配器上运行,但在这里似乎不起作用。我似乎也不能只向 getCurrentList() 添加一个项目,因为它不受支持。另外,我没有使用数据库,只是向服务器发出请求。
所以我的问题是,除了使数据源无效之外,还有更好的方法吗?有没有办法在发送消息时阻止列表闪烁?还是这个库不适合我的聊天 Activity ?
编辑:
我的差异回调
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)
}
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) {
}
})
}
最佳答案
PagedListAdapterHelper 在分页组件中已弃用,因此我们应该使用 AsyncPagedListDiffer而不是它。
代码示例:
import android.arch.paging.AsyncPagedListDiffer;
import android.arch.paging.PagedList;
import android.arch.paging.PagedListAdapter;
import android.support.annotation.NonNull;
import android.support.v7.util.DiffUtil;
import android.view.LayoutInflater;
import android.view.ViewGroup;
public class PagedItemsArrayAdapter extends PagedListAdapter<Item, MyViewHolder> {
private final AsyncPagedListDiffer<Item> mDiffer;
public PagedItemsArrayAdapter() {
super(DIFF_CALLBACK);
mDiffer = new AsyncPagedListDiffer<>(this, DIFF_CALLBACK);
setHasStableIds(true);
}
@Override
public long getItemId(int position) {
Item item = mDiffer.getItem(position);
return item.id;
}
@Override
public int getItemCount() {
return mDiffer.getItemCount();
}
@Override
public void submitList(PagedList<Item> pagedList) {
pagedList.addWeakCallback(pagedList.snapshot(), new PagedList.Callback() {
@Override
public void onChanged(int position, int count) {
}
@Override
public void onInserted(int position, int count) {
mDiffer.submitList(pagedList);
}
@Override
public void onRemoved(int position, int count) {
}
});
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int position) {
Item item = mDiffer.getItem(position);
viewHolder.onBind(item);
}
private static DiffUtil.ItemCallback<Item> DIFF_CALLBACK = new DiffUtil.ItemCallback<Item>() {
@Override
public boolean areItemsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
return oldItem.getId() == newItem.getId();
}
@Override
public boolean areContentsTheSame(@NonNull Item oldItem, @NonNull Item newItem) {
return oldItem.equals(newItem);
}
};
关于android - 如何使用架构组件分页库停止在回收站 View 上闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48438944/