RecyclerView 的优化介绍

  • 数据处理和视图加载分离:数据的处理逻辑尽可能放在异步处理,onBindViewHolder 方法中只处理数据填充到视图中。
  • 数据优化:分页拉取远端数据,对拉取下来的远端数据进行缓存,提升二次加载速度;对于新增或者删除数据通过 DiffUtil 来进行局部刷新数据,而不是一味地全局刷新数据。
示例
public class AdapterDiffCallback extends DiffUtil.Callback {
    private List < String > mOldList;
    private List < String > mNewList;
    public AdapterDiffCallback(List < String > oldList, List < String > newList) {
        mOldList = oldList;
        mNewList = newList;
        DiffUtil.DiffResult
    }
    @Override
    public int getOldListSize() {
        return mOldList.size();
    }
    @Override
    public int getNewListSize() {
        return mNewList.size();
    }
    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return mOldList.get(oldItemPosition).getClass().equals(mNewList.get(newItemPosition).getClass());
    }
    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return mOldList.get(oldItemPosition).equals(mNewList.get(newItemPosition));
    }
}
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new AdapterDiffCallback(oldList, newList));
diffResult.dispatchUpdatesTo(mAdapter);
  • 布局优化:减少布局层级,简化 ItemView
  • 升级 RecycleView 版本到 25.1.0 及以上使用 Prefetch 功能
  • 通过重写 RecyclerView.onViewRecycled(holder) 来回收资源
  • 如果 Item 高度是固定的话,可以使用RecyclerView.setHasFixedSize(true); 来避免 requestLayout 浪费资源
  • 对 ItemView 设置监听器,不要对每个 Item 都调用 addXxListener,应该大家公用一个 XxListener,根据 ID 来进行不同的操作,优化了对象的频繁创建带来的资源消耗
  • 如果多个 RecycledView 的 Adapter 是一样的,比如嵌套的 RecyclerView 中存在一样的 Adapter,可以通过设置 RecyclerView.setRecycledViewPool(pool),来共用一个RecycledViewPool

你可能感兴趣的:(RecyclerView 的优化介绍)