-
1 尝试使用ViewHolder设计模式实现滚动性能: developer.android.com/training/improving-layouts/… – Hareshkumar Chhelana公司 评论 2014年11月28日12:27 -
@HareshChhelana谢谢你的回答! 但根据链接,我已经在使用ViewHolder模式: developer.android.com/training/meterial/lists-cards.html开发人员 – 法尔沃杰 评论 2014年11月28日12:37 -
2 你能分享一些关于适配器设置的代码和布局的XML文件吗。 这看起来不正常。 此外,你有没有分析并查看时间花在哪里? – 伊吉特 评论 2014年11月29日4:51 -
2 我面临着同样的问题。 除了在Lollipop之前速度快,在Android L中速度慢得令人难以置信。 – 伺服7 评论 2015年1月28日21:47 -
1 您也可以共享正在导入的库的版本吗。 – 德罗伊德卡斯 评论 2016年4月6日12:48
16个答案
替换复杂布局 (嵌套视图,RelativeLayout)和新优化的ConstraintLayout。 在Android Studio中激活它:转到SDK Manager->SDK Tools选项卡->Support Repository->选中ConstraintLayout for Android和Solver for ConstraintLayout。 添加到依赖项: 编译“com.android.support.constraint:constraint-layout:1.0.2” 如果可能,请使用 相同高度 。并添加: recyclerView.setHasFixedSize(true); 使用默认的RecyclerView 图形缓存 方法,并根据您的情况进行调整。 这样做不需要第三方库: recyclerView.setItemViewCacheSize(20); recyclerView.setDrawingCacheEnabled(true); recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 如果你用很多 图像 ,确保他们 尺寸和压缩都是最佳的 。缩放图像也可能影响性能。 问题有两个方面——使用的源图像和解码的位图。 以下示例为您提供了如何解码从web下载的аn图像的提示: InputStream是=(InputStream)url.getContent(); 位图工厂。 选项选项=新BitmapFactory。 选项(); options.inPreferredConfig=位图。 配置。 RGB_565; 位图图像=BitmapFactory.decodeStream(is,null,options);
确保 onBindViewHolder() 是作为 便宜的 尽可能地。 您可以在中设置OnClickListener一次 onCreateViewHolder()上 并通过接口调用适配器外部的侦听器,传递单击的项。 这样就不会一直创建额外的对象。 在对此处的视图进行任何更改之前,还要检查标志和状态。 viewHolder.itemView.setOnClickListener(新View.OnClickListener(){ @覆盖 public void onClick(查看视图){ 项目项=getItem(getAdapterPosition()); outsideClickListener.onItemClicked(项目); } }); 当数据发生更改时,请尝试 仅更新受影响的项目 。例如,而不是使用 notifyDataSetChanged() ,添加/加载更多项目时,只需使用: 适配器.notifyItemRangeInserted(范围开始,范围结束); 适配器.notifyItemRemoved(位置); adapter.notifyItemChanged(位置); 适配器.notifyItemInserted(位置); 发件人 Android开发人员网站 :
最后依靠notifyDataSetChanged()。
适配器.setHasStableIds(true);
RecyclerView将尝试合成可见的结构更改 适配器的事件,这些适配器报告它们具有稳定的ID 方法。 这有助于实现动画和视觉效果 对象持久性,但单个项目视图仍需要 反弹并放松。
-
23 -
1 第七部分完全错了! setHasStableIds(true)除了使用adapter.notifyDataSetChanged()之外什么也不做。 链接: developer.android.com/reference/android/support/v7/widget/… – 本地服务器 评论 2017年8月14日14:45 -
1 我明白为什么 recyclerView.setItemViewCacheSize(20); 可以提高性能。 但是 recyclerView.setDrawingCacheEnabled(true); 和 recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 尽管如此! 我不确定这些会改变什么。 这些是 查看 允许您以编程方式将图形缓存检索为位图并在以后使用它的特定调用。 回收站视图 似乎对此没有任何反应。 评论 2017年11月13日20:33 -
2 @AbdelhakimAkodadi,滚动通过缓存变得平滑。 我已经测试过了。你怎么能不这么说,这是显而易见的。 当然,如果有人像疯了一样滚动,没有任何帮助。 我只显示了其他选项,比如setDrawingCacheQuality,我不使用它,因为图像质量在我的例子中很重要。 我不鼓吹DRAWING_CACHE_QUALI TY_HIGH,但建议有兴趣的人深入研究并调整选项。 – 加利娅 评论 2017年11月14日12:07 -
三 不推荐使用setDrawingCacheEnabled()和setDrawing CacheQuality()。 而是使用硬件加速。 developer.android.com/reference/android/view/… – 沙扬_瑞安 评论 2018年12月28日13:41
-
-
我不熟悉弗雷斯科(阅读……他们的承诺很好)。 也许他们对如何将缓存与RecyclerViews结合使用有一些见解。 我知道你不是唯一有这个问题的人: github.com/facebook/fresco/issues/414 . 评论 2016年6月28日17:40
如果 适配器 项目具有固定大小,然后设置:
recyclerView.setHasFixedSize(true); 如果数据实体可以用long表示( 哈希代码() 例如),然后设置:
适配器.hasStableIds(true); 并实施:
//YourAdapter.java(您的适配器.java)
@覆盖
public long getItemId(int位置){
return-items.get(position).hashcode()// id()
} 在这种情况下 项目.id() 不会起作用,因为即使 项目 的内容已更改。
附言:如果您使用DiffUtil,则无需执行此操作! 使用正确缩放的位图。 不要重新发明轮子和使用库。 更多信息如何选择 在这里 . 始终使用最新版本的 回收站视图 例如,在 25.1.0 -预取。 更多信息 在这里 . 使用DiffUtill。
DiffUtil是必须的 .
官方文件 . 简化物品的布局! 用于丰富TextViews的小型库- 文本视图RichDrawable
-
-
1
公共类RecyclerAdapter扩展了Recycler视图。 适配器<回收适配器。 ViewHolder>{ 上下文mContext; 列表<String>mNames; public RecyclerAdapter(上下文,列表<String>名称){ mContext=上下文; mNames=名称; } @覆盖 CreateViewHolder上的public ViewHolder(ViewGroup ViewGroup,int viewType){ 视图视图=LayoutInfliter.from(viewGroup.getContext()) .inflate(android.R.layout.simple_list_item_1,viewGroup,false); return new ViewHolder(视图); } @覆盖 public void onBindViewHolder(ViewHolder ViewHolder,int位置){ //填充。 if(mNames!=null){ 字符串名称=mNames.get(位置); viewHolder.name.setText(名称); } } @覆盖 public int getItemCount(){ if(mNames!=null) return mNames.size(); 其他的 返回0; } /** *保存RecyclerView视图的静态类。 */ 静态类ViewHolder扩展了RecyclerView。 视图支架{ TextView名称; public ViewHolder(查看项查看){ super(itemView); name=(TextView)itemView.findViewById(android.R.id.text1); } } }
recyclerView.postDelayed(新的Runnable()){ @覆盖 公共void run(){ recyclerView.setAdapter(mAdapter); } },100);
fun getImageThumbnail(context:context,imageFileName:String):位图? { val-options=位图工厂。 选项() options.inSampleSize=2个选项 options.inPreferredConfig=位图。 配置。 RGB_565; val目录=context.filesDir val file=文件(目录,图像文件名) if(!file.exists())返回null val位图:bitmap=BitmapFactory.decodeStream(FileInputStream(file),null,options)!! var较大=位图宽度 if(bitmat.width<bitmat.height)bigger=bitmap.height val zarib=(200.toDouble()/更大) val width=(bitmap.width*zarib).toInt() val height=(bitmap.height*zarib).toInt() return ThumbnailUtils.extractThumbnali(位图、宽度、高度) }
毕加索.get().load(currentItem.getArtist_image()) .fit()//这将自动获取图像的大小并将其缩小 占位符(R.drawable.ic_doctor) .into(holder.img_uploaderProfile,新回调(){ @覆盖 公共void onSuccess(){ } @覆盖 public void onError(异常e){ Toast.makeText(context,“上传者图像出错”,Toast.LENGTH_LONG).show(); } });