掌握 Android 中的 RecyclerView 优化

掌握 Android 中的 RecyclerView 优化

RecyclerView 是 Android 中一个功能强大的小部件,用于高效显示大型列表或数据网格。为了确保应用程序的性能和响应能力,优化 RecyclerView 实现至关重要。这里我们将探讨各种技术和概念,帮助充分利用 RecyclerView。

一、RecyclerView Pool以及何时使用它

RecyclerView Pool 是一种帮助管理 RecyclerView 中视图的内存和性能的机制。它本质上是一个缓存,用于保存当前在屏幕上不可见但在不久的将来可能再次需要的视图。这显着减少了每次新项目进入可见区域时膨胀新视图的开销。

何时使用 RecyclerView Pool:

  • 处理大型列表或数据网格时使用它。
  • 当列表中的项目具有不同的视图类型时,请选择 RecyclerView Pool。

二、onCreateViewHolder 和 onBindViewHolder

在RecyclerView中,onCreateViewHolder和onBindViewHolder是适配器中必不可少的方法。它们共同为列表中的每个项目创建和绑定视图。

  • onCreateViewHolder在需要创建新视图时被调用。它负责扩展布局并创建 ViewHolder 实例。
  • 当现有视图被新项目重用时,将调用onBindViewHolder 。它将数据绑定到视图持有者,允许您更新视图的内容。
  • onBindViewHolder不应该用于绑定点击侦听器,我们应该注意我们在其中执行的匿名对象或任务。仔细阅读下面的代码,然后我会解释为什么?
kotlin 复制代码
class  MyAdapter ( private  val items: List<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { 

    inside  class  ViewHolder (itemView: View) : RecyclerView.ViewHolder(itemView) { 
        init { 
            itemView.setOnClickListener { 
                // 处理项目click here 
                val position = adapterPosition 
                if (position != RecyclerView.NO_POSITION) { 
                    val clickedItem = items[position] 
                    // 处理 clickedItem 的点击事件
                } 
            } 
        } 
    } 

    override  fun  onCreateViewHolder (parent: ViewGroup , viewType: Int ) : ViewHolder { 
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, Parent, false ) 
        return ViewHolder(view) 
    } 

    override  fun  onBindViewHolder (holder: ViewHolder ,position: Int ) { 
        val currentItem = items[position] 
        / / 此处将数据绑定到视图持有者
    } 

    override  fun  getItemCount () = items.size 
}
  • 在onBindViewHolder中,为每个项目单独生成单击侦听器,从而导致多个侦听器实例。通过将点击监听器放置在 中ViewHolder,它们在 ViewHolder 创建时就形成了,由于 ViewHolder 的可重用性,提高了内存效率。

三、优化 RecyclerView 的不同方法

  1. 使用图像库:

处理图像时,建议使用提供位图池的图像库。这可以防止过多的内存使用和频繁的垃圾收集。

java 复制代码
Glide.with( this ) 
    .load(imageUrl) 
    .placeholder(R.drawable.placeholder_image) 
    .error(R.drawable.error_icon) 
    .into(imageView)
  1. 优化图像尺寸:从服务器获取图像尺寸和宽高比,以避免不必要的调整大小和缩放。
  2. setHasStableIds:此方法应用于setHasStableIds(true)启用稳定的项目 ID。这有助于有效地更新和重新排序项目,而无需不必要的重新绑定。
kotlin 复制代码
class  MyAdapter ( private  val itemList: List<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { 

    init { 
        setHasStableIds( true ) // 为此适配器启用稳定 ID
     } 
    
    //....
 }
  1. setHasFixedSize:如果RecyclerView大小本身是固定的并且不会因其内容而改变,则使用它setHasFixedSize(true)可以通过避免不必要的布局计算来帮助提高性能。
kotlin 复制代码
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) 
recyclerView.setHasFixedSize( true ) // 为 RecyclerView 启用固定大小
  1. setItemViewCacheSize:使用此方法调整缓存大小,以控制保留多少个离屏视图。这可以帮助管理内存使用。
kotlin 复制代码
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) 
recyclerView.setItemViewCacheSize( 10 ) // 根据项目大小将视图缓存大小设置为自定义值

四、视图无效与请求布局

  • Invalidate:用于指示视图的内容已更改并且需要重新绘制。
  • requestLayout:用于请求新的布局通道,影响视图的大小和位置。

您可能想知道为什么我突然谈论invalidate与requestLayout。让我解释。

我讨论了"无效"与"请求布局",以说明它们如何影响视图的生命周期。这会影响屏幕重绘时间,过多的布局和绘制阶段会降低性能。要优化 Android 页面,尤其是 RecyclerView,彻底掌握视图生命周期至关重要。

让我用一个例子来进一步解释一下:

当 TextView 的 wrap_content 与 100dp 固定时,将或应该调用什么(invalidate 或 requestLayout)?

回答:

当 TextView 的宽度设置为 时wrap_content,调用requestLayout()会更合适。这是因为这requestLayout()表明视图层次结构需要重新测量和布局,以确保内容正确地适合边界。

当 TextView 的宽度固定时(例如,设置为特定值,如100dp),调用invalidate()通常就足够了。它通知系统视图的内容已更改,并且需要在现有布局范围内重新绘制。这可以避免在更新视图外观时进行不必要的重新布局计算。

五、ViewHolder模式

ViewHolder 模式是一种设计模式,它通过最大限度地减少对 .recyclerview 的调用次数来增强 recyclerview 的性能findViewById()。它涉及创建一个 ViewHolder 类,该类保存对项目布局中视图的引用。这允许在用户滚动列表时有效地重用视图。有关 ViewHolder 模式的综合示例,请查看此链接

六、默认的废料和脏视图类型

在RecyclerView中,每种视图类型的废视图和脏视图的默认计数设置为 5。对于标题等仅 1 或 2 个剪贴视图就足够的情况,此通用编号可能不是最佳选择。废料视图是可重用的、分离的视图,可以轻松地重新附加。

为了提高内存效率,您可以根据每个特定视图类型的流行程度自定义池大小,从而定制剪贴视图行为。这种方法通过有效管理RecyclerView中不同类型项目的剪贴视图数量,确保优化内存使用。

kotlin 复制代码
val customRecycledViewPool = RecyclerView.RecycledViewPool().apply { 
    setMaxRecycledViews(viewType, poolSize) // 设置自定义 viewType 和 poolSize
 }

七、结论

优化 RecyclerView 实施对于保持流畅且响应迅速的用户体验至关重要。通过理解 RecyclerView Pool 和 ViewHolder 模式等概念,并优化视图创建和绑定,您可以确保您的应用程序有效地处理大量数据。

请记住,每种优化技术都有特定的目的,并且应用这些技术的组合可以显着提高 RecyclerView 的性能。

相关推荐
fatiaozhang95271 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO2 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师2 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师2 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
大耳猫3 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白3 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度
dpxiaolong4 小时前
RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)
android·windows
tangweiguo030519875 小时前
Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
android
老狼孩111225 小时前
2025新版懒人精灵零基础及各板块核心系统视频教程-全分辨率免ROOT自动化开发
android·机器人·自动化·lua·脚本开发·懒人精灵·免root开发
打死不学Java代码6 小时前
PaginationInnerInterceptor使用(Mybatis-plus分页)
android·java·mybatis