Android入门(RecyclerView控件)
RecyclerView控件
首先,他并不是系统自带的控件,而是在androidx
中的,也就是还需要从外部导入。不过好在IDEA已经帮我们导入过了,在build.gralde
中
1 | dependencies { |
导入之后就可以正常使用了
普通使用
- 首先直接在layout布局中声明一个recyclerView控件
1
2
3
4<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/> - 然后继承他的适配器,直接放实例代码相较于listview:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class Girl(val girlName: String, val girlImg: Int){}
class GirlAdapter(val girlList: List<Girl>) :
RecyclerView.Adapter<GirlAdapter.ViewHolder>() {
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val girlName = view.findViewById<TextView>(R.id.girlName)
val girlImg = view.findViewById<ImageView>(R.id.girlImg)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.girl_item, parent, false)
return ViewHolder(view)
}
override fun getItemCount() = girlList.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val girl = girlList[position]
holder.girlImg.setImageResource(girl.girlImg)
holder.girlName.text = girl.girlName
}
}- 他只需要接受一个data的参数,更容易理解其中的内容
- 他需要实现三个方法和一个内部类
属性 | 释义 |
---|---|
ViewHolder | 用来简化操作,提前维护好view变量,提高效率 |
onCreateViewHolder() | 创建ViewHolder对象 |
getItemCount() | 获取队列的总数 |
onBindViewHolder() | 实现数据的绑定 |
3. 然后再需要使用他的地方,直接引用,直接给实例代码:
1 | super.onCreate(savedInstanceState) |
创建了一个LinearLayoutManager对象,并将它设置到RecyclerView当中。LayoutManager用于指定RecyclerView的布局方式,这里使用的
LinearLayoutManager是线性布局的意思,可以实现和ListView类似的效果
布局管理
主要得益于RecyclerView出色的设计。ListView的布局排列是由自身去管理的,而RecyclerView则将这个工作交给了LayoutManager。LayoutManager制定了一套可扩展的布局排列接口,子类只要按照接口的规范来实现,就能定制出各种不同排列方式的布局了。
除了LinearLayoutManager之外,RecyclerView还给我们提供了GridLayoutManager和
StaggeredGridLayoutManager这两种内置的布局排列方式。GridLayoutManager可以用实现网格布局,StaggeredGridLayoutManager可以用于实现瀑布流布局
线性布局都可以参照下面的实例
给一个实例:
1 | val layoutManager = StaggeredGridLayoutManager(3, |
点击事件
首先,RecyclerView并没有像Listview一样定义了点击事件。他并没有专门的点击事件。他的点击事件需要根据具体的每个子项控件去设置。而这样往往更加方便使用和易于理解。
下面是一个示例:
1 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { |
点击事件是在onCreateViewHolder中定义的。
上述代码分别为最
外层布局和ImageView都注册了点击事件,itemView表示的就是最外层布局。RecyclerView
的强大之处也在于此,它可以轻松实现子项中任意控件或布局的点击事件。我们在两个点击事
件中先获取了用户点击的position,然后通过position拿到相应的Fruit实例,再使用Toast分
别弹出两种不同的内容以示区别