📜  如何在Android中提高RecyclerView滚动性能?

📅  最后修改于: 2021-05-10 14:44:28             🧑  作者: Mango

RecyclerView是Android中的主要UI组件,用于表示庞大的数据列表。如果未正确实施RecyclerView,则它将无法平滑滚动,并且可能会导致不良的用户体验。为了使其能够平滑滚动,我们必须对其进行优化并遵循一些技巧以提高其性能。在本文中,我们将看到为优化RecyclerView的滚动性能而应遵循的步骤。

1.在RecyclerView项目中为ImageView设置特定的宽度和高度

在RecyclerView中,如果您正在使用ImageView在RecyclerView项中显示服务器中的图像,则为ImageView指定恒定大小。如果RecyclerView项目中ImageView的大小未固定,则RecyclerView将花费一些时间来根据Image的大小加载和调整RecyclerView项目大小。因此,为了提高RecyclerView的性能,我们应该保持ImageView的大小以使其更快地加载RecyclerView。

2.避免使用NestedView

在为RecyclerView创建项目时,请避免将NestedView用于RecyclerView项目。嵌套会降低RecyclerView的性能。因此,最好避免使用嵌套视图。嵌套视图意味着在Vertical RecyclerView中添加Horizontal RecyclerView。此类嵌套可能会降低RecyclerView性能。下面是嵌套的RecyclerView的图像。

3.使用setHasFixedsize方法

如果我们RecyclerView项目的高度是固定的,那么我们应该在卡片项目的XML中使用setHasFixedsize方法。这将固定我们RecyclerView物品的高度,并防止其增加或减小卡片布局的大小。我们也可以在我们的Java类中使用此方法,在该类中声明我们的RecyclerView适配器和布局管理器。

4.使用图像加载库加载图像

RecyclerView由许多图像组成,如果要在所有卡中加载图像,则从服务器加载每个图像将花费大量时间。由于垃圾回收程序在主线程上运行,因此这是导致UI无响应的原因。连续分配和释放内存会导致GC频繁运行。这可以通过使用位图池概念来防止。解决此问题的简单方法是使用图像加载库,例如Picasso,Glide,Fresco等。这些库将处理所有位图池概念以及与图像有关的所有委托任务。

5.减少OnBindViewHolder方法的工作

OnBindViewHolder方法用于在RecyclerView的每个项目中设置数据。此方法将在每个RecyclerView项目中设置数据。我们应该减少这种方法的工作。我们只需要用这种方法设置数据,而不必做任何比较或繁重的工作。如果我们用此方法执行任何繁重的任务,则将降低RecyclerView的性能,因为为每个项目设置数据将花费特定的时间。因此,为了提高RecyclerView的性能,我们应该在OnBindViewHolder方法中减少工作量。

6.对您的RecyclerView使用NotifyItem方法

每当您在RecyclerView中执行操作(例如在RecyclerView中的任意位置添加项目或从RecyclerView的特定位置删除项目)时,都应使用NotifyItemChange()方法。

Java
// below method will notify the adapter 
// of our RecyclerView when an item 
// from RecyclerView is removed. 
adapter.notifyItemRemoved(position)
    
// below method will be used when
// we update the data of any RecyclerView 
// item at a fixed position.  
adapter.notifyItemChanged(position)
    
// below method is used when we add 
// any item at a specific position
// of our RecyclerView.  
adapter.notifyItemInserted(position)
    
// below method is used when we add multiple 
// number of items in our recyclerview.
// start represents the position from 
// which the items are added.
// end represents the position upto 
// which we have to add items.   
adapter.notifyItemRangeInserted(start, end)


当我们调用notifyDataSetChanged()方法时,它将不会处理RecyclerView适配器的完整重新排序,但会发现该位置的项目是否与以前相同,从而减少了工作量。

想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处,前往由我们的专家精心策划的指南,以使您立即做好行业准备!