1.避免在onBind方法中創(chuàng)建對象
因為onBind方法的調(diào)用時機是View滑到屏幕內(nèi)可顯示時這個方法就會調(diào)用此方法坠韩,避免在這個方法內(nèi)設(shè)置點擊事件等創(chuàng)建對象的操作。
2.避免在onBind方法中做耗時操作,可采用邏輯前移或變成私有變量碱璃,比如:
- 1.TextView.setText(Html.fromHtml(str);
- 2.計算UI的寬高比杨凑,margin,padding晴楔,每次都用DensityUtils.dp2px()轉(zhuǎn)換顿苇。
- 3.每次都new一些可以復(fù)用都對象:adapter,viewparam
3.通過RecyclerPool給RecycleView設(shè)置緩存池實現(xiàn)多個RecycleView復(fù)用。
多用于RecycleView嵌套RecycleView税弃,減少對ViewHolder的創(chuàng)建
//緩存池
private RecyclerView.RecycledViewPool childPool;
public XXAdapter(){
childPool = new RecyclerView.RecycledViewPool();
}
private class RcyViewHolder extends RecyclerView.ViewHolder {
private SRecyclerView sRcy;
public RcyViewHolder(View itemView) {
super(itemView);
sRcy = itemView.findViewById(R.id.rcy_child);
LinearLayoutManager manager = new LinearLayoutManager(mContext);
//1.設(shè)置回收
manager.setRecycleChildrenOnDetach(true);
manager.setOrientation(LinearLayoutManager.HORIZONTAL);
sRcy.setLayoutManager(manager);
//2.設(shè)置緩存Pool
sRcy.setRecycledViewPool(childPool);
}
}
4.需要大量加載圖片的列表或是復(fù)雜布局纪岁,重寫onScroll事件,滑動停止后再加載圖片或布局或采用「骨架屏」框架方案则果。
5.靈活應(yīng)用刷新機制幔翰,減少沒必要的綁定方法的調(diào)用。
notifydatasetchange全部刷新西壮,notifyItemRemoved(0)局部刪除遗增, notifyItemRangeInserted(start,end)等刷新機制的選擇。
6.減少層級繪制
7.設(shè)置setItemViewCacheSize緩存大小
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
其實setItemViewCacheSize設(shè)置的是CacheViews的大小
1.CacheViews中的緩存只能position相同才能復(fù)用款青,并且不會重新Bind.
2.CacheViews滿了后會移除到RecyclerPool中做修,并重置ViewHolder.
3.RecyclerPool中的緩存復(fù)用需要重新Bind.
所以我們可以適當(dāng)?shù)耐ㄟ^調(diào)用setItemViewCacheSize方法,來增加CacheViews的大新詹荨(默認(rèn)是2)饰及,來防止小范圍的滑動導(dǎo)致的重復(fù)Bind而導(dǎo)致的卡頓。典型的拿空間還時間康震,所以要考慮內(nèi)存問題燎含,根據(jù)自己的應(yīng)用實際情況設(shè)置大小
8.recyclerView.setHasFixedSize(true)避免重新計算item高度。
當(dāng)知道Adapter內(nèi)Item的改變不會影響RecyclerView寬高的時候腿短,可以設(shè)置為true讓RecyclerView避免重新計算大小屏箍。
- onItemRangeChanged()
- onItemRangeInserted()
- onItemRangeRemoved()
- onItemRangeMoved()
當(dāng)調(diào)用Adapter的增刪改插方法,最后就會根據(jù)mHasFixedSize這個值來判斷需要不需要requestLayout()橘忱;所以這4個方法不會重新繪制赴魁。
當(dāng)執(zhí)行notifyDataSetChanged()時,最后調(diào)用了onChanged鹦付,調(diào)用了requestLayout()尚粘,會去重新測量寬高,所以我們設(shè)置為true時敲长,大小還是重新計算郎嫁。
9.RecyclerView的新機制:預(yù)缺獭(Prefetch)
需要升級Recycle版本到25以上的版本才能使用recyclerview prefetch功能。
參考文章:RecyclerView的新機制:預(yù)仍箢酢(Prefetch)
RecyclerView Prefetch功能探究