先上个StackOverflow的解决方案,有空再做总结
原文地址:https://stackoverflow.com/questions/27188536/recyclerview-scrolling-performance
-
使用新的优化ConstraintLayout 替换复杂布局(嵌套视图,RelativeLayout)。在Android Studio中激活它:转到SDK Manager - > SDK Tools选项卡 - > Support Repository - >检查ConstraintLayout for Android和Solver for ConstraintLayout。添加到依赖项:
compile 'com.android.support.constraint:constraint-layout:1.0.2'
-
如果可能,使RecyclerView的所有元素具有相同的高度。并添加:
recyclerView.setHasFixedSize(true);
-
使用默认的RecyclerView 绘图缓存方法并根据您的情况进行调整。您不需要第三方库来执行此操作:
recyclerView.setItemViewCacheSize(20); recyclerView.setDrawingCacheEnabled(true); recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
-
如果您使用许多图像,请确保它们的大小和压缩是最佳的。缩放图像也可能会影响性能。问题有两个方面 - 使用的源图像和解码的位图。以下示例为您提供了如何解码从Web下载的图像的提示:
InputStream is = (InputStream) url.getContent(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap image = BitmapFactory.decodeStream(is, null, options);
最重要的部分是指定inPreferredConfig
- 它定义将为图像的每个像素使用多少字节。请记住,这是首选方案。如果源图像有更多颜色,它仍将使用不同的配置进行解码。
-
确保onBindViewHolder()尽可能便宜。您可以将OnClickListener设置为一次,
onCreateViewHolder()
并通过接口调用适配器外部的侦听器,并传递单击的项目。这样您就不会一直创建额外的对象。在对视图进行任何更改之前,还要检查标志和状态。viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Item item = getItem(getAdapterPosition()); outsideClickListener.onItemClicked(item); } });
-
数据更改后,尝试仅更新受影响的项目。例如
notifyDataSetChanged()
,在添加/加载更多项目时,不要使整个数据集无效,只需使用:adapter.notifyItemRangeInserted(rangeStart, rangeEnd); adapter.notifyItemRemoved(position); adapter.notifyItemChanged(position); adapter.notifyItemInserted(position);
依靠notifyDataSetChanged()作为最后的手段。
但是,如果您需要使用它,请使用唯一的ID维护您的项目:
adapter.setHasStableIds(true);
RecyclerView将尝试为适配器合成可见的结构更改事件,以便在使用此方法时报告它们具有稳定的ID。这有助于动画和视觉对象持久性的目的,但单个项目视图仍然需要反弹和重新传输。
即使你做的一切都正确,很可能RecyclerView仍然没有你想要的那么顺利。
网友评论