- 在onBindViewHolder里设置监听可能会创建多个View.onclicklistener对象
在onCreateViewHolder方法里设置监听
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final RecyclerView.ViewHolder holder = onCreateDefaultViewHolder(parent, viewType);
if (holder != null) {
holder.itemView.setTag(holder);
holder.itemView.setOnLongClickListener(onLongClickListener);
holder.itemView.setOnClickListener(onClickListener);
}
return holder;
}
/**
* 可以共用同一个listener,相对高效
*/
public static abstract class OnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder) v.getTag();
onClick(holder.getAdapterPosition(), holder.getItemId());
}
public abstract void onClick(int position, long itemId);
}
setInitialItemPrefetchCount
对于嵌套的RecyclerViews,在内部LayoutManagers上调用LinearLayoutManager的新setInitialItemPrefetchCount()方法(在v25.1中可用)以获得最佳性能。例如,如果垂直列表中的行至少显示三个项目,请调用setInitialItemPrefetchCount(4)。setHasFixedSize
//伪代码
void onDataChange(){
if(HasFixedSize){
layoutChild();
} else {
requestLayout();
}
}
使用场景,1,如果adapter的数据变化不会引起recyclerview的大小变化,setHasFixedSize(true)
2,如果ItemView的高度固定,可以使用setHasFixSize(true)。这样RecyclerView在onMeasure阶段可以直接计算出高度,不需要多次计算子ItemView的高度,这种情况对于垂直RecyclerView中嵌套横向RecyclerView效果非常显著。
- 多个recyclerView共用一个RecycledViewPool
RecyclerView.RecycledViewPool recycledViewPool = new RecyclerView.RecycledViewPool();
recyclerView1.setRecycledViewPool(recycledViewPool);
recyclerView2.setRecycledViewPool(recycledViewPool);
-
DiffUtil (原理:动态规划)
swapadapter
rv的setadapter大家都会使用,没什么好说的,但关于swapadapter可能就有些人不太知道了,这两个方法最大的不同之处就在于setadapter会直接清空rv上的所有缓存,而swapadapter会将rv上的holder保存到pool中,google提供swapadapter方法考虑到的一个应用场景应该是两个数据源有很大的相似部分的情况下,直接使用setadapter重置的话会导致原本可以被复用的holder全部被清空,而使用swapadapter来代替setadapter可以充分利用rv的缓存机制,可以说是一种更为明智的选择。
- 其他
升级 RecycleView 版本到 25.1.0 及以上使用 Prefetch 功能,可参考 RecyclerView 数据预取。
设置 RecyclerView.addOnScrollListener(listener); 来对滑动过程中停止加载的操作。
如果不要求动画,可以通过 ((SimpleItemAnimator) rv.getItemAnimator()).setSupportsChangeAnimations(false); 把默认动画关闭来提升效率。
对 TextView 使用 String.toUpperCase 来替代 android:textAllCaps="true"。
对 TextView 使用 StaticLayout 或者 DynamicLayout 的自定义 View 来代替它。
通过重写 RecyclerView.onViewRecycled(holder) 来回收资源。
通过 RecycleView.setItemViewCacheSize(size); 来加大 RecyclerView 的缓存,用空间换时间来提高滚动的流畅性。
如果多个 RecycledView 的 Adapter 是一样的,比如嵌套的 RecyclerView 中存在一样的 Adapter,可以通过设置 RecyclerView.setRecycledViewPool(pool); 来共用一RecycledViewPool。
通过 getExtraLayoutSpace 来增加 RecyclerView 预留的额外空间(显示范围之外,应该额外缓存的空间),如下所示:
new LinearLayoutManager(this) {
@Override protected int getExtraLayoutSpace(RecyclerView.State state) {
return size;
}
};