1,布局優(yōu)化
2炫七,取消默認(rèn)動畫
3爬立,Item 等高
4,RecycledViewPool
5万哪,避免創(chuàng)建過多對象
6侠驯,局部刷新
一,布局優(yōu)化
首當(dāng)其沖壤圃,減少層次結(jié)構(gòu)陵霉、減少過渡繪制,可以提高item的解析測量與繪制的效率伍绳。另外,應(yīng)該盡量避免多次measure & layout 次數(shù)乍桂。
1冲杀、 View 的三大過程
從ViewRoot的 performTraversals() 方法開始效床,依次經(jīng)過 measure() , layout() 和 draw() 三個過程才最終將一個View繪制出來权谁。
2剩檀、ViewGroup 性能
相比之下,F(xiàn)rameLayout & LinearLayout 的 measure 要遠(yuǎn)優(yōu)于 RelativeLayout旺芽,因為 RelativeLayout 對子View做了兩次measure沪猴,才能確定寬高,因為子View之間有彼此依賴的關(guān)系采章。但是LinearLayout 的子View如果加上了 layout_weight 的屬性运嗜,也需要進(jìn)行兩次測量。
2悯舟,取消默認(rèn)動畫
取消RecyclerView的默認(rèn)動畫担租,也可改善一些。
mRecyclerView.setItemAnimator(null);
3抵怎,Item 等高
如果可以的話奋救,把所有的 Item 的高度固定大小,這樣可以減少測量次數(shù)反惕,尤其是對于 GridLayoutManager尝艘。
mRecyclerView.setHasFixedSize(true);
4,RecycledViewPool
可以給RecyclerView設(shè)置一個ViewHolder的對象池姿染,這個池稱為RecycledViewPool背亥,這個對象池可以節(jié)省你創(chuàng)建ViewHolder的開銷,更能避免GC盔粹。默認(rèn)會自動創(chuàng)建一個隘梨。
RecycledViewPool mPool = mRecyclerView.getRecycledViewPool();
RecycledViewPool可以自主控制需要緩存的ViewHolder數(shù)量:
mPool.setMaxRecycledViews(itemViewType, number);
RecyclerView可以設(shè)置自己所需要的ViewHolder數(shù)量:
mRecyclerView.setItemViewCacheSize(10);
那么,可以按需調(diào)整draw緩存
mRecyclerView.setItemViewCacheSize(20);
mRecyclerView.setDrawingCacheEnabled(true);
mRecyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
5舷嗡,避免創(chuàng)建過多對象
onCreateViewHolder 和 onBindViewHolder 對時間都比較敏感轴猎,盡量避免繁瑣的操作和循環(huán)創(chuàng)建對象。例如創(chuàng)建 OnClickListener进萄,可以全局創(chuàng)建一個捻脖,然后數(shù)據(jù)通過 itemView.setTag 攜帶。
6中鼠,局部刷新
可以用一下一些方法可婶,替代notifyDataSetChanged,已達(dá)到局部刷新的目的援雇。
notifyItemChanged(int position)
notifyItemInserted(int position)
notifyItemRemoved(int position)
notifyItemMoved(int fromPosition, int toPosition)
notifyItemRangeChanged(int positionStart, int itemCount)
notifyItemRangeInserted(int positionStart, int itemCount)
notifyItemRangeRemoved(int positionStart, int itemCount)
如果必須用 notifyDataSetChanged()矛渴,那么最好設(shè)置 mAdapter.setHasStableIds(true)