我已经基于“ 创建列表和卡片”指南创建了RecyclerView示例。我的适配器具有仅用于扩大布局的模式实现。
问题是滚动性能差。 这在RecycleView中只有8个项目。
在某些测试中,我验证了在Android L中不会发生此问题。但是在KitKat版本中,性能下降是显而易见的。
我最近遇到了同样的问题,因此这是我对最新的RecyclerView支持库所做的工作:
用 新的优化的ConstraintLayout 替换复杂的布局 (嵌套视图,RelativeLayout)。在Android Studio中激活它:转到SDK Manager->“ SDK工具”选项卡->支持存储库->选中Android的ConstraintLayout和ConstraintLayout的Solver。添加到依赖项:
compile 'com.android.support.constraint:constraint-layout:1.0.2'
如果可能,请使RecyclerView的所有元素具有 相同的height 。并添加:
recyclerView.setHasFixedSize(true);
使用默认的RecyclerView 图形缓存 方法,并根据您的情况进行调整。您不需要第三方库来这样做:
recyclerView.setItemViewCacheSize(20); recyclerView.setDrawingCacheEnabled(true); recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
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-它定义将为图像的每个像素使用多少字节。请记住,这是 首选 。如果源图像具有更多颜色,则仍将使用其他配置对其进行解码。
inPreferredConfig
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仍然可能无法达到您想要的平稳状态。