在本文中,我们将介绍:
- 为什么ListView需要?
- 怎么RecyclerView接手的ListView?
- ReyclerViewwith的实施ListAapter。为了更好地理解,我们将创建一个示例项目😉
为什么需要 ListView?
正如我们所知,如今大多数应用程序都使用可滚动屏幕,例如 WeChat 聊天、Facebook 帖子、Tencent 视频。你有没有看到共同点?布局是一样的,只是改变了数据!。实际上,您不能自己手动添加所有这些视图,因为您不知道运行时的内容数量。例如:你不知道我会有多少聊天。
出于这个原因,我们需要 ListView 来帮助我们显示水平/垂直可滚动的视图集合。
RecyclerView 如何接管 Listview
首先RecyclerView是为了填补ListView. 当涉及到一长串列表时,创建视图是昂贵的,它确实变得昂贵。假设一个带有食物列表的食品订购应用程序,可能有 100 或数千种食物,在您的移动屏幕上您只看到 10 种(假设大小限制)。那么这些视图是如何绘制在屏幕上的呢?让我们来看看。
ListView每次滚动新项目时只需创建新视图,即如果列表中有 1000 个项目ListView将创建 1000 个视图。创建和绘制成本非常高。
在这种情况下,Recyclerview将只创建一次需要在屏幕上显示的视图数量(在本例中为 10 个)。但是如果我滚动呢?开发人员不用担心,当您向下滚动时,上部视图会被回收以用作新的底部视图,并且数据已更改,仅此而已。
- 其中,RecyclerView诸如动画添加或删除项目之类的操作已经实现,您无需执行任何操作。
- ListView仅支持带有行显示视图的垂直滚动,而RecyclerView支持水平、网格和交错布局,您只需提及使用LayoutManager.
让我们用 ListAdapter 实现 Recycler View
到目前为止,您已经大致了解我们为什么使用 RecyclerView。RecyclerView 使得显示大量数据变得非常容易。我们只需要提供数据和布局(它应该看起来如何),它会为您动态创建元素。现在让我们创建一个名为RecyclerView_fun.
打开Android Studio并按照以下步骤操作:-
- 创建一个项目:
- 点击新建项目
- 选择空活动。,点击NEXT
- 选择一个应用程序和包名称,点击FINISH。
2. RecyclerView在 XML 中定义
- 打开activity_main.xml
开始输入 <recyclerView. 将出现自动建议,单击它,或从下面手动输入或复制。
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
- 创建单项布局,它将在 RecyclerView 中显示为列表。
- 右键单击 res -> 新建 -> 布局资源文件 -> 选择
- 给一个名字,item_student因为我们将显示学生的数据。
- 根据您的喜好创建一个设计,我创建了一个简单的:p
4. 创建一个模型类,数据源(我们要展示的对象类型)
- 创建一个StudentModel具有name,roll number属性的数据类。
RecyclerView 准备好了,item_view 准备好了,data Source 也准备好了。现在我们需要有人把他们绑起来。 适配器来了。Adapter 是 View 和 Data 之间的桥梁,它基本上接受布局和数据,然后将两者绑定并显示在 RecyclerView 上。
如今,我们使用ListAdapterover RecyclerView.Adapter(),因为它提供了有关添加/删除项目的良好功能。
ListAdapter不等于ListView。
- 创建一个ListAdapter
- 创建一个StudentAdapter扩展类ListAdapter<>
-
Listadapter采用 2 个类型参数:
- 第一:此适配器将接收的列表的类型。
- 第二:ViewHolder适配器将使用的扩展类。
它应该看起来像这样。
- 通过将鼠标悬停在类名称上来实现成员:
- 现在构造方法onCreateViewHolder,当 RecyclerView 需要一个给定类型的新 [ViewHolder] 来表示一个项目时调用它。创建一个视图并返回它。
- 在里面MyViewHolder我可以访问item_student,引用各个视图,以便我可以将动态数据绑定到它。
- 实现时间,onBindViewHolder由RecyclerView调用,在指定位置显示数据。此方法应更新 [ViewHolder.itemView] 的内容以反映给定位置的项目。
但仍然ListAapter给我们红色信号,因为它需要一个DiffUtil.ItemCallback类的对象作为参数。这减少了显式调用notifyDataSetChanged等notifyDataSetRemoved方法的痛苦。此回调将以最佳方式检查新旧列表。所以让我们给它一个Companion object
- 第一种方法areContentsTheSame()用于检查两个项目是否具有相同的数据
- 另一种方法areItemsTheSame()用于检查两个对象是否具有相同的项目。
如您所见,areContentsTheSame检查卷号,因为它是唯一的。第二个检查对象等价性。
ListAdapter 实现完成,所有设置都让 Warp 完成。
设置:RecyclerView_Adapter
- 参考 RecyclerView
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
- 设置布局管理器
recyclerView .layoutManager = LinearLayoutManager(this)
- 获取数据(来自本地或互联网)
好吧,我的数据源是:
private fun dummyData(): List<StudentModel> {
val list : ArrayList<StudentModel> = ArrayList()
for(i in 1..20){
list.add(StudentModel("Android", i))
}
return list
}
- 创建一个对象StudentAdapter并将其设置为recyclerView
val adapter = StudentAdapter()
recyclerView.adapter = adapter
向适配器提交数据列表,以便它可以开始工作😉
adapter.submitList(data)
- 最后结果
[我删除了项目背景颜色,通常看起来更好]