乐趣区

关于android:RecyclerView-在-RecyclerView-中使用-ListAdapter

本文是介绍 RecyclerView 入门 系列文章 的第二篇。如果您曾经对创立 RecyclerView 有了肯定的意识,请持续浏览本文。如果尚未相熟,建议您首先浏览本系列中的 第一篇文章。

RecyclerView 能够很高效地显示列表数据。对于动态的列表数据,默认的 adapter 足矣。然而,在少数状况下,RecyclerView 的数据是动态变化的。拿 备忘工作 的利用举例: 次要操作是增加新的工作事项,删除曾经实现的工作事项。notifyItemInserted() 能够将新工作增加到指定地位,然而须要删除元素的时候问题就来了,notifyItemRemoved() 只有在您已知待删工作的地位时才有成果。尽管能够写代码来确定待删工作的地位,而后调用 notifyItemRemoved(),然而代码会变得十分繁冗。调用 notifyDataSetChanged() 也是一个方法,然而它会重绘整个视图,包含数据未发生变化的局部,使得该操作的代价变大。而 ListAdapter 能够解决元素的增加和删除而无需重绘视图,甚至能够为变动增加动画成果。

应用 ListAdapter 的另一个益处是: 当增加或删除元素的时候,还能够增加动画。这样用户能够很直观地看到列表数据的变动。尽管没有 ListAdapter 也能够实现动画成果,然而这就须要开发者自行实现,并且因为带有动画的视图须要重绘,所以无奈达到同样的性能体现。

增加元素的动画成果

解决差别比拟

DiffUtil 是 ListAdapter 可能高效扭转元素的神秘所在。DiffUtil 会比拟新旧列表中减少、挪动、删除了哪些元素,而后输入更新操作的列表将原列表中的元素高效地转换为新的元素。

为了可能辨认新的数据,DiffUtil 须要您重写 areItemsTheSame() 和 areContentsTheSame()。areItemsTheSame() 查看两个元素是否为同一元素。areContentsTheSame() 查看两个元素是否蕴含雷同的数据。

areItemsTheSame() 比拟元素的示意图

areContentsTheSame() 比拟元素的示意图

Adapter 类中增加 DiffUtil 对象,并且复写 areItemsTheSame()areContentsTheSame()

<!-- Copyright 2019 Google LLC. 
   SPDX-License-Identifier: Apache-2.0 -->

object FlowerDiffCallback : DiffUtil.ItemCallback<Flower>() {override fun areItemsTheSame(oldItem: Flower, newItem: Flower): Boolean {return oldItem.id == newItem.id}

   override fun areContentsTheSame(oldItem: Flower, newItem: Flower): Boolean {return oldItem == newItem}
}

Adapter 的父类由 RecyclerView.Adapter 改为 ListAdapter,并传入 DiffCallback

<!-- Copyright 2019 Google LLC. 
   SPDX-License-Identifier: Apache-2.0 -->
   
class FlowerAdapter : ListAdapter<String, FlowerAdapter.FlowerViewHolder>(FlowerDiffCallback)

更新列表

ListAdapter 通过 submitList()) 办法获取数据,该办法提交了一个列表来与以后列表进行比照并显示。也就是说您无需再重写 getItemCount(),因为 ListAdapter 会负责管理列表。

Activity 类中,调用 AdaptersubmitList() 办法并传入数据列表。

<!-- Copyright 2019 Google LLC. 
   SPDX-License-Identifier: Apache-2.0 -->

val flowerList = resources.getStringArray(R.array.flower_array).toMutableList()
val flowerAdapter = FlowerAdapter()
flowerAdapter.submitList(flowerList)

Adapter 类中,onBindViewHolder() 当初能够应用 getItem()) 从数据列表中获取指定地位的元素了。

<!-- Copyright 2019 Google LLC. 
   SPDX-License-Identifier: Apache-2.0 -->

override fun onBindViewHolder(holder: FlowerViewHolder, position: Int) {holder.bind(getItem(position))
}

就这么简略。仅需几步简略操作就能够在您的 RecyclerView 中应用 ListAdapter。当初您的利用能够通过应用 ListAdapter 来更新那些发生变化的元素以取得更好的性能和用户体验了。

下一步

对于 ListAdapter 的 残缺示例代码 都在这里。

感激浏览 RecyclerView 系列 的第二篇文章。请持续关注将来更多对于 RecyclerView 的内容。

如果您想理解更多对于 ListAdapter 的内容,请参考 官网文档。

退出移动版