安卓回收器查看滚动性能
我根据创建列表和卡片指南创建了RecyclerView示例。我的适配器有一个模式实现,仅用于膨胀布局。
问题是滚动性能差。这在只有8个项目的回收视图中。
在某些测试中,我验证了在Android L中不会发生此问题。但在KitKat版本中,性能的下降是显而易见的。
我根据创建列表和卡片指南创建了RecyclerView示例。我的适配器有一个模式实现,仅用于膨胀布局。
问题是滚动性能差。这在只有8个项目的回收视图中。
在某些测试中,我验证了在Android L中不会发生此问题。但在KitKat版本中,性能的下降是显而易见的。
我最近遇到了同样的问题,所以这就是我对最新的RecyclerView支持库所做的:
将复杂布局(嵌套视图、相对布局)替换为新的优化约束布局。在 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 下载的 аn 图像的提示:
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也可能仍然没有像您希望的那样顺利运行。