- 在onBindViewHolder里設置監(jiān)聽可能會創(chuàng)建多個View.onclicklistener對象
在onCreateViewHolder方法里設置監(jiān)聽
@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,在內(nèi)部LayoutManagers上調(diào)用LinearLayoutManager的新setInitialItemPrefetchCount()方法(在v25.1中可用)以獲得最佳性能鬼悠。例如啦扬,如果垂直列表中的行至少顯示三個項目伟墙,請調(diào)用setInitialItemPrefetchCount(4)。setHasFixedSize
//偽代碼
void onDataChange(){
if(HasFixedSize){
layoutChild();
} else {
requestLayout();
}
}
使用場景,1浑娜,如果adapter的數(shù)據(jù)變化不會引起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 (原理:動態(tài)規(guī)劃)
DiffUtil swapadapter
rv的setadapter大家都會使用乖篷,沒什么好說的响驴,但關(guān)于swapadapter可能就有些人不太知道了,這兩個方法最大的不同之處就在于setadapter會直接清空rv上的所有緩存撕蔼,而swapadapter會將rv上的holder保存到pool中豁鲤,google提供swapadapter方法考慮到的一個應用場景應該是兩個數(shù)據(jù)源有很大的相似部分的情況下秽誊,直接使用setadapter重置的話會導致原本可以被復用的holder全部被清空,而使用swapadapter來代替setadapter可以充分利用rv的緩存機制琳骡,可以說是一種更為明智的選擇锅论。
- 其他
升級 RecycleView 版本到 25.1.0 及以上使用 Prefetch 功能,可參考 RecyclerView 數(shù)據(jù)預取日熬。
設置 RecyclerView.addOnScrollListener(listener); 來對滑動過程中停止加載的操作棍厌。
如果不要求動畫,可以通過 ((SimpleItemAnimator) rv.getItemAnimator()).setSupportsChangeAnimations(false); 把默認動畫關(guān)閉來提升效率竖席。
對 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;
}
};