一、使用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 其实现有用到以上部分思路。对象