当前位置: 首页 > 知识库问答 >
问题:

Android RecycerView滚动性能

羊舌自强
2023-03-14

我创建了基于创建列表和卡片指南的RecolyerView示例。我的适配器有一个模式实现,只用于扩展布局。

问题是滚动性能不佳。这在一个只有8个项目的RecycleView中。

在一些测试中,我验证了在Android L中不会出现这个问题。但在KitKat版本中,性能的下降是明显的。

共有1个答案

温亮
2023-03-14

我最近也遇到了同样的问题,所以这是我对最新的RecyclerView支持库所做的工作:

>

  • 用新的优化的ConstraintLayout替换复杂的布局(嵌套视图、RelativeLayout)。在Android Studio中激活它:转到SDK Manager->SDK Tools选项卡->Support Repository->check ConstraintLayout for Android&Solver for ConstraintLayout。添加到依赖项:

    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    

    如果可能,使RecyclerView的所有元素具有相同的高度。并添加:

    recyclerView.setHasFixedSize(true);
    
    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-它定义了图像的每个像素将使用多少字节。请记住,这是一个首选选项。如果源图像具有更多的颜色,则仍将使用不同的配置对其进行解码。

    确保onBindViewWholder()尽可能便宜。您可以在onCreateViewHolder()中设置一次OnClickListener,并通过接口调用适配器外部的监听器,传递单击的项。这样您就不会一直创建额外的对象。在对这里的视图进行任何更改之前,还要检查标志和状态。

    viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Item item = getItem(getAdapterPosition());
              outsideClickListener.onItemClicked(item);
          }
    });
    
    adapter.notifyItemRangeInserted(rangeStart, rangeEnd);
    adapter.notifyItemRemoved(position);
    adapter.notifyItemChanged(position);
    adapter.notifyItemInserted(position);
    

    作为最后的手段,依赖于notifyDataSetChanged()。

    但如果您需要使用它,请使用唯一的ID维护您的项目:

        adapter.setHasStableIds(true);
    

    RecyclerView将尝试为适配器合成可见的结构更改事件,这些适配器在使用此方法时报告它们具有稳定的ID。这有助于动画和可视化对象的持久化,但是单个项视图仍然需要回弹和重新发送。

  •  类似资料:
    • 问题内容: 我已经基于“ 创建列表和卡片”指南创建了RecyclerView示例。我的适配器具有仅用于扩大布局的模式实现。 问题是滚动性能差。 这在RecycleView中只有8个项目。 在某些测试中,我验证了在Android L中不会发生此问题。但是在KitKat版本中,性能下降是显而易见的。 问题答案: 我最近遇到了同样的问题,因此这是我对最新的RecyclerView支持库所做的工作: 用

    • 我使用recyclerview来显示项目,项目大小可以是0 - 500。 但它的滚动性能非常慢,有时它会滞后/停止视图1~2秒。我想在回收器视图中获得流畅的滚动体验。 即使我从我用Glide加载的cardview布局中删除了图像,对性能没有影响。 fragment_home.xml 我的卡片视图布局文件 onBindViewHolder 方法从我的适配器 calss

    • 问题内容: 我只是想 禁用 Safari(OSX Lion)中 的弹性滚动/弹跳效果 。 我找到了在CSS中为body 设置的解决方案,但正如预期的那样,它仅 禁用了滚动条 ,因此,如果网站比屏幕“长”,您 将无法滚动! 欢迎任何解决方案或提示!谢谢! 问题答案: 您可以通过应用以下CSS来更普遍地实现这一目标: 这样,无论内容如何,​​都可以在其中滚动,但是请注意,触发事件的滚动上下文现在不是。

    • scroll 事件允许对页面或元素滚动作出反应。我们可以在这里做一些有用的事情。 例如: 根据用户在文档中的位置显示/隐藏其他控件或信息。 当用户向下滚动到页面末端时加载更多数据。 这是一个显示当前滚动的小函数: window.addEventListener('scroll', function() { document.getElementById('showScroll').innerH

    • jd.pageScrollTo(OBJECT) 将页面滚动到目标位置。 OBJECT 参数说明: 参数 类型 必填 说明 scrollTop Number 是 滚动到页面的目标位置(单位px) duration Number 否 滚动动画的时长,默认300ms,单位 ms 示例代码 jd.pageScrollTo({ scrollTop: 0, duration: 500 })

    • 我有一个类可以画一些非常简单的图形,比如直线、圆和矩形。线条可以动态扩展,有时当它们扩展到超出分辨率时,如果没有滚动条,就无法看到。因此,我已经将JScrollPane添加到JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条还是无法滚动。 这是我所拥有的:-一个绘制组件(线条、矩形、圆形)的类-一个设置JFrame/JScrollPane的类 这是我的GUI类的摘录代码: 通过上面的代