之前一篇文章介绍了 ListView 和 RecyclerView 的对比
, 这里继续记录下RecyclerView中常用的性能优化方案。
RecyclerView
尽量在onCreateViewHolder()
设置点击事件,而不在onBindViewHolder()
中设置点击事件。让 View - ViewHolder - ClickListener 是 1-1-1 的对应关系。
RecyclerView
嵌套布局在嵌套布局中(竖则滚动 + 局部横向滚动),可以在内部嵌套的RecyclerView
中设置LinearLayoutManager.setInitialPrefetchItemCount(int count)
setInitialPrefetchItemCount()
只在线性布局中才有这个函数,且在内部嵌套RecyclerView
设置才有效。 不过 这个方法可以提升 内部嵌套RecyclerView
的预加载性能。
RecyclerView
局部刷新notifyDataSetChanged()
: 一个常用的数据刷新方法,所有数据全部刷新,性能较低,在可以局部刷新的情况下不建议使用该函数。
notifyItemChanged(int position)
: 刷新指定postion位置上的数据(需要准确知道变化数据的postion)
DiffUtil
: 查找新/旧 数据的差异,然后执行差异中的变化。(推荐使用)
void onNewDataArrived(List<News> news) {
List<News> oldNews = myAdapter.getItems();
// diff判断逻辑,建议放在异步线程中,diff结束后,结果在主线程中刷新
DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldNews, news));
myAdapter.setNews(news);
result.dispatchUpdatesTo(myAdapter);
}
END!