写点什么

RecyclerView 是 “何方神圣“,农民工看完都学会了

用户头像
Android架构
关注
发布于: 刚刚

RecyclerView?最重要的组成部分之一就是需要显示的数据。对于比较复杂的应用来说,数据可能是来自数据库或者来自于网络,不过这里我们简单使用字符串资源文件作为应用的数据源。


在?strings.xml?文件中,创建一个字符串数组来存放花的名称。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


<resources>


<string name="app_name">RecyclerSample</string>


<string-array name="flower_array">


<item>Lily</item>


<item>Poppy</item>


<item>Sunflower</item>


<item>Freesia</item>


<item>Daisy</item>


<item>Rose</item>


<item>Daffodil</item>


<item>Lavender</item>


<item>Peony</item>


<item>Lilac</item>


<item>Dahlia</item>


<item>Tulip</item>


<item>Dandelion</item>


<item>Geranium</item>


<item>Gardenia</item>


<item>Rhododendron</item>


<item>Azalea</item>


</string-array>


</resources>


然后,创建一个类,名字为?Datasource,并且可以接收一个 Context 类型的参数。创建一个叫做?getFlowerList()?的函数,它负责返回花的名称列表。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


class Datasource(val context: Context) {


fun getFlowerList(): Array<String> {


return context.resources.getStringArray(R.array.flower_array)


}


}


在?MainActivity.onCreate()?中,创建一个变量叫做?flowerList,然后将?getFlowerList()?的返回结果赋给它。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


override fun onCreate(savedInstanceState: Bundle?) {


super.onCreate(savedInstanceState)


setContentView(R.layout.activity_main)


val flowerList = Datasource(this).getFlowerList()


}


RecyclerView 布局




接下来,在?activity_main?布局文件中将?TextView?替换为?RecyclerView,并且将其?layoutManager?设置为?LinearLayoutManager。使用?LinearLayoutManager?意味着未来数据将以纵向列表或者横向列表的形式显示 (默认是纵向列表)。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="match_parent"


android:layout_height="match_parent"


xmlns:app="http://schemas.android.com/apk/res-auto">


<androidx.recyclerview.widget.RecyclerView


android:id="@+id/recycler_view"


android:layout_width="match_parent"


android:layout_height="match_parent"


app:layoutManager="LinearLayoutManager"/>


</FrameLayout>


表项布局





上面的示意图表示一个包含数据表项的?RecyclerView。在这里,组成?RecyclerView?的表项 (Item) 里会包含花的名称。


创建一个新的布局文件,将它命名为?flower_item,它用来决定每一个表项的显示布局。本例中布局仅需要显示一个鲜花的名称,所以这里只需要?TextView


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="match_parent"


android:layout_height="wrap_content">


<TextView


android:id="@+id/flower_text"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:textSize="32sp" />


</FrameLayout>


拆分 Adapter 类




接下来是?RecyclerView?的重头戏了,也就是?ViewHolder?和?Adapter?类。ViewHolder 负责存储 RecyclerView 中每一个单独的表项所需要显示的信息。RecyclerView 仅需要创建当前所显示的表项数量的 ViewHolder 外加缓存中的几个 ViewHolder 即可。随着用户滑动屏幕,ViewHolder 会被回收 (使用新数据进行填充),已有的表项会在一端消失,并且在另一端显示一个新的表项。Adapter 类从数据源获得数据,并且将数据传递给正在更新其所持视图的 ViewHolder。下图显示了 RecyclerView、Adapter、ViewHolder 和数据之间的协作关系。



创建 Adapter


创建一个叫做 FlowerAdapter 的类,所需显示的列表数据作为该类的参数。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


class FlowerAdapter(val flowerList: Array<String>) {


}


创建 ViewHolder


创建一个叫做 FlowerViewHolder 的内部类,并且它可以接收一个 itemView 作为参数。在 ViewHolder 中,创建一个变量来引用 TextView,然后将它指向表项布局里对应的视图。然后创建 bind() 函数,它用来将花的名字 (字符串) 和携带数据的 UI (flowerTextView) 关联起来。bind() 函数接收传入的字符串,并且将字符串作为 flowerTextView 的文本内容。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


class FlowerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){


private val flowerTextView:TextView = itemView.findViewById(R.id.flower_text)


fun bind(word: String){


flowerTextView.text = word


}


}


继承 RecyclerView.Adapter


更新 FlowerAdapter 的类定义,使其继承 RecyclerView.Adapter 类,并且将 FlowerViewHolder 作为参数传入。


<!-- Copyrigh


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


t 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


class FlowerAdapter(val flowerList: Array<String>) :


RecyclerView.Adapter<FlowerAdapter.FlowerViewHolder>() {


}


重写?RecyclerView.Adapter?的类需要重写三个方法?onCreateViewHolder()onBindViewHolder()?和?getItemCount()


重写 onCreateViewHolder()


当?ViewHolder?创建的时候会调用该方法。在该方法里进行初始化和填充?RecyclerView?中的表项视图。该视图使用前面我们创建的用于显示文本的布局。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FlowerViewHolder {


val view = LayoutInflater.from(parent.context)


.inflate(R.layout.flower_item, parent, false)


return FlowerViewHolder(view)


}


重写 onBindViewHolder()


onBindViewHolder()?被调用的时候,会传入参数?ViewHolder?和一个位置 (position),它表示在 flowerList 中所绑定的表项的位置。该位置可以用于提取表项所需的数据,并且将数据传递给 ViewHolder 来使数据绑定到对应的 UI。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


override fun onBindViewHolder(holder: FlowerViewHolder, position: Int) {


holder.bind(flowerList[position])


}


重写 getItemCount()


RecyclerView 显示一个列表,所以它需要知道列表里共有多少项。由于 flowerList 就是数据源,所以直接返回它的长度即可。


<!-- Copyright 2019 Google LLC.


SPDX-License-Identifier: Apache-2.0 -->


override fun getItemCount(): Int {

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
RecyclerView 是 “何方神圣“,农民工看完都学会了