一、使用ConstraintLayout減小布局層級。css
二、能夠的話,設置RecyclerView佈局等高,而後設置recyclerView.setHasFixedSize(true)
這樣能夠避免每次繪製Item時,再也不從新計算Item高度。java
三、根據需求修改RecyclerView默認的繪製緩存選項緩存
recyclerView.setItemViewCacheSize(20); recyclerView.setDrawingCacheEnabled(true); recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
四、在onBindViewHolder/getView方法中,減小邏輯判斷,減小臨時對象建立。例如:複用事件監聽,在其方法外部建立監聽,能夠避免生成大量的臨時變量。
減小邏輯判斷參考方案:佈局
//優化前: class MyRecyclerView.Adapter extends RecyclerView.Adapter { static final TODAYS_DATE = new Date(); static final DATE_FORMAT = new SimpleDateFormat("MM dd, yyyy"); public onBindViewHolder(Task.ViewHolder tvh, int position) { Task task = getItem(position); if (TODAYS_DATE.compareTo(task.dateDue) > 0) { tvh.backgroundView.setColor(Color.GREEN); } else { tvh.backgroundView.setColor(Color.RED); } String dueDateFormatted = DATE_FORMAT.format(task.getDateDue()); tvh.dateTextView.setDate(dueDateFormatted); } }
//優化後,改寫model public class TaskViewModel { int overdueColor; String dateDue; } public onBindViewHolder(Task.ViewHolder tvh, int position) { TaskViewModel taskViewModel = getItem(position); tvh.backgroundView.setColor(taskViewModel.getOverdueColor()); tvh.dateTextView.setDate(taskViewModel.getDateDue()); }
六、避免整個列表的數據更新,只更新受影響的佈局。例如,加載更多時,不使用notifyDataSetChanged()
,而是使用notifyItemRangeInserted(rangeStart, rangeEnd)
優化
七、scrollingCache=false
animationCache=false
(針對ListView)
scrollingCache: scrollingCache本質上是drawing cache,你可讓一個View將他本身的drawing保存在cache中(保存爲一個bitmap),這樣下次再顯示View的時候就不用重畫了,而是從cache中取出。默認狀況下drawing cahce是禁用的,由於它太耗內存了,可是它確實比重畫來的更加平滑。而在ListView中,scrollingCache是默認開啓的,咱們能夠手動將它關閉。
animateCache: ListView默認開啓了animateCache,這會消耗大量的內存,所以會頻繁調用GC,咱們能夠手動將它關閉掉。spa
八、對於RecyclerView,持有item具備的獨特id,能夠很容易地肯定具體item並單獨更新,當變化發生時,能夠按照以下方式更新,從而避免總體刷新:code
adapter.setHasStableIds(true); adapter.notifyItemRemoved(position); adapter.notifyItemChanged(position); adapter.notifyItemInserted(position);
參考:orm
https://stackoverflow.com/questions/27188536/recyclerview-scrolling-performance
https://stackoverflow.com/questions/27993627/optimizing-recyclerview-listview
另外附上一個大神寫的Adapter優化:http://www.jianshu.com/p/411ab861034f 其實現有用到以上部分思路。對象