RecyclerView是Android中的主要UI组件,用于表示庞大的数据列表。如果未正确实施RecyclerView,则它将无法平滑滚动,并且可能会导致不良的用户体验。为了使其能够平滑滚动,我们必须对其进行优化并遵循一些技巧以提高其性能。在本文中,我们将看到为优化RecyclerView的滚动性能而应遵循的步骤。
Note:
If you are looking for the implementation guide of RecyclerView. Then do check out: How to implement RecyclerView in Android
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适配器和布局管理器。
recyclerView.setHasFixedSize(true)
4.使用图像加载库加载图像
RecyclerView由许多图像组成,如果要在所有卡中加载图像,则从服务器加载每个图像将花费大量时间。由于垃圾回收程序在主线程上运行,因此这是导致UI无响应的原因。连续分配和释放内存会导致GC频繁运行。这可以通过使用位图池概念来防止。解决此问题的简单方法是使用图像加载库,例如Picasso,Glide,Fresco等。这些库将处理所有位图池概念以及与图像有关的所有委托任务。
Note: You may also refer to the Top 5 Image Loading Libraries in Android
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适配器的完整重新排序,但会发现该位置的项目是否与以前相同,从而减少了工作量。