我最近遇到了同样的问题,因此这是我对最新的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.depreStream(is, null, options);
最重要的部分是指定
inPreferredConfig-它定义将为图像的每个像素使用多少字节。请记住,这是 首选
。如果源图像具有更多颜色,则仍将使用其他配置对其进行解码。
- 确保 onBindViewHolder() 尽可能 便宜 。您可以一次设置onClickListener
onCreateViewHolder()
并通过接口调用Adapter外部的侦听器,从而传递被单击的项。这样,您就不会一直创建额外的对象。在对视图进行任何更改之前,还要检查标志和状态。
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);
- 从Android开发者网站:
作为最后的手段,依赖notifyDataSetChanged()。
但是,如果您需要使用它,请使用 唯一的ID 维护商品:
adapter.setHasStableIds(true);
RecyclerView将尝试为使用此方法报告适配器具有稳定ID的适配器合成可见的结构更改事件。这可以帮助实现动画和视觉对象的持久性,但是仍然需要重新放置和重新布置单个项目视图。
即使您做的一切正确,RecyclerView仍然可能无法达到您想要的平稳状态。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)