RecyclerView

概述

高效:可以循环使用

RecyclerView 是 Android 中用于展示大量数据集合的组件,它是 ListView 的升级版

灵活地显示列表数据

RecyclerView :容器 显示所有的内容和交互
Adapter :配置有多少 Item 及 Item 的样子要显示什么内容
ViewHolder :只管理当前这一个Item (使用 ViewHolder 管理每一个Item)
每个 Adapter 都有管理自己的 ViewHolder

  1. *添加 RecyclerView 控件 **
  2. 创建 Adapter
  3. 创建 ViewHolder(每个 ViewHolder 都需要自己来建)
    • onCreateViewHolder 解析 Item 的布局资源
  4. 给外部提供一个设置我的数据源的方法 setData
    • getItemCount() 根据数据源设置 Item 数量
  5. 在 Fragment 中配置 RecyclerView
    • adapter
    • layoutManager
    • 配置数据源
    • 按页显示 PagerSnapHelper().attachToRecyclerView(recyclerView)
  6. 把数据配置到对应的 Item 上
    • onBindViewHolder
    • MyViewHolder 中的 bind() 方法
    • 在bind方法中可以添加点击事件

使用步骤:

  1. 添加 RecyclerView 控件

在创建RecyclerView对应的Adapter之前,要先创建 Item 对应的 Layout

  1. 创建 Adapter

新建一个类

创建 Adapter ,继承于 RecyclerView.Adapter
创建对应的 ViewHolder

创建 Adapter 管理 RecyclerView 显示的子视图(即管理所有的 Item),Adapter 里面又需要一个 ViewHolder
在 Adapter 里面创建一个类取名 MyViewHolder 继承于 RecyclerView.ViewHolder,并需要传入其管理的 View

也可以传入 binding (可以减少 findViewById 这个操作)
class MyViewHolder(private val binding:LayoutPictureltemBinding):RecyclerView.ViewHolder(binding.root)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//创建 ViewHolder ,持有一个 view 实现重复利用
//实际上重复利用的是 ViewHolder ,但是 ViewHolder 又管理着一个对应的 view,所以就重复利用了那个对应的 view
class QQAdapter:RecyclerView.Adapter<QQAdapter.MyViewHolder>(){

class MyViewHolder(view: View):RecyclerView.ViewHolder(view){
fun bind(model:Friend){
val iconImageView = itemView.findViewById<ImageView>(R.id.imageView)
val nameTextView = itemView.findViewById<TextView>(R.id.tv_name)
iconImageView.setImageResource(model.icon)
nameTextView.text = model.name
}
}

//---有三个方法必须要实现

}

(1)onCreatViewHolder()
用于创建一个 ViewHolder 实例,加载item界面的布局文件

(确定每一个 Item 的样式,长什么样
通过 context 来获取系统中的一些资源)

创建 Item 对应的 layout 资源进行布局(解析)

1
2
3
4
5
6
7
8
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder{
//解析 layout 资源
//自己创建一个 layoutInflater 布局解析器
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater.inflate(R.layout.layout_qq_item,parent,false)

return MyViewHolder(view)
}
1
2
3
4
5
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder{
val inflater = Layoutlnflater.from(parent.context)
val binding = LayoutColorltemBinding.inflate(inflater,parent, attachToParent: false)
return MyViewHolder(binding)
}

(2)getItemCount()
配置 Item 的个数(外部给数据源才能配置其个数)
返回列表大小,即返回项的数量

1
2
3
override fun getItemCount():Int{
return mFriends.size
}

(3)onBindViewHolder()
绑定数据,告诉每一个 ViewHolder 该显示什么内容
在填充数据
采用两个参数: ViewHolder ,以及要绑定数据的位置

1
2
3
4
5
override fun onBindViewHolder(holder: MyViewHolder, position: Int){
//取出 position 对应的数据源 拿给 ViewHolder 去显示

holder.bind(mFriends[position])
}
1
2
3
4
5
6
7
8
9
10
11
12
class MyViewHolder(view: View):RecyclerView.ViewHolder(view){
//把数据拿给每个控件去刷新
fun bind(model:Friend){
//找到对应的控件,把数据设置给它 itemView 就是 view

val iconImageView = itemView.findViewById<ImageView>(R.id.imageView)
val nameTextView = itemView.findViewById<TextView>(R.id.tv_name)

iconImageView.setImageResource(model.icon)
nameTextView.text = model.name
}
}
  1. 创建 ViewHolder(每个 ViewHolder 都需要自己来建)
    创建 Item 对应的layout资源,进行布局
    创建布局文件,解析布局文件,在 onCreatViewHolder 返回 MyViewHolder 传入该 view
1
2
3
4
5
6
7
8
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder{
//解析 layout 资源
//自己创建一个 layoutInflater 布局解析器
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater.inflate(R.layout.layout_qq_item,parent,false)

return MyViewHolder(view)
}
1
2
3
4
5
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder{
val inflater = Layoutlnflater.from(parent.context)
val binding = LayoutColorltemBinding.inflate(inflater,parent, attachToParent: false)
return MyViewHolder(binding)
}
  1. 在 Fragment 中配置 RecyclerView
    在 Fragment 的 onViewCreated() 方法中
  • (1)先找到 recyclerView
    val recyclerView = binding.recyclerView

  • (2)配置布局方式 LinearLayoutManager 布局管理器
    layoutManager 布局管理器,就是 Item 的管理布局的(这个属性最重要)

    系统提供的只有三种(没有想要的就自定义):
    LinearLayoutManager(context,orientation,reverselayout) 线性
    StaggeredGridLayoutManager(spanCount: Int orientation: int) 交错 错列网络(一行显示几个)
    GridLayoutManager 网格

    正常 交错式显示 瀑布流 网格

1
2
3
4
5
recyclerView.layoutManager = LinearLayoutManager(         
requireContext(), //context
RecyclerView.VERTICAL,//HORIZONTAL 横向或竖向滚动
false //是否需要反过来布局 123 or 321
)
  • (3)配置适配器 adapter
1
2
3
//给对应的数据 得知要显示什么东西
val mAdapter = QQAdapter()
recyclerView.adapter = mAdapter
  • (4)按页显示
    这样可以达到 ViewPager 的效果

    1
    PagerSnapHelper().attachToRecyclerView(recyclerView)
  • (5)配置数据源

    1
    2
    3
    4
    5
    6
    mAdapter.setData(listOf(
    Friend(R.drawable.icon1,"Jack",""),
    Friend(R.drawable.icon2,"Rose",""),
    Friend(R.drawable.icon3,"Marry",""),
    Friend(R.drawable.icon4,"Lily",""),
    ))}
  1. 把数据配置到对应的 Item 上
    将数据显示到对应的 Item上
    具体在 onBindViewHolder 、 MyViewHolder 中 bind 方法
1
2
3
4
5
override fun onBindViewHolder(holder: MyViewHolder, position: Int){
//取出 position 对应的数据源 拿给 ViewHolder 去显示

holder.bind(mFriends[position])
}

可以直接通过 itemView 得到我们传过去的 view
这里的 itemView 是 ViewHolder 中的一个属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyViewHolder(view: View):RecyclerView.ViewHolder(view){
//把对应的数据设置给 view
//把数据拿给每个控件去刷新

fun bind(model:Friend){
//找到对应的控件(设置对应的属性值)把数据设置给它
//这里的 itemView 是 ViewHolder 中的一个属性,存储的是 view

val iconImageView = itemView.findViewById<ImageView>(R.id.imageView)
val nameTextView = itemView.findViewById<TextView>(R.id.tv_name)

iconImageView.setImageResource(model.icon)
nameTextView.text = model.name
}

}

常用方法

  1. setLayoutManager(layoutManager: RecyclerView.LayoutManager): 设置RecyclerView的布局管理器,用于确定列表项的排列方式,如线性布局、网格布局等。
  2. setAdapter(adapter: RecyclerView.Adapter): 设置RecyclerView的适配器,用于绑定数据和视图,以便在列表中显示数据项。
  3. addItemDecoration(decoration: RecyclerView.ItemDecoration): 添加列表项的装饰,如分割线、间距等。
  4. addItemTouchHelper(callback: ItemTouchHelper.Callback): 添加滑动删除、拖动排序等交互功能。
  5. scrollToPosition(position: Int): 滚动RecyclerView到指定位置。
  6. smoothScrollToPosition(position: Int): 平滑滚动RecyclerView到指定位置。
  7. addOnScrollListener(listener: RecyclerView.OnScrollListener): 添加滚动监听器,用于监听RecyclerView的滚动状态。
  8. setOnItemClickListener(listener: (position: Int) -> Unit): 设置列表项的点击事件监听器。

RecyclerView 的 setOnScrollChangeListener 方法用于设置滚动监听器,监听RecyclerView的滚动状态变化。

RecyclerView 还提供了一些其他类似的滚动监听方法,例如:

  1. addOnScrollListener(RecyclerView.OnScrollListener listener):添加一个滚动监听器,继承自RecyclerView.OnScrollListener类,可以通过重写其方法来监听RecyclerView的滚动状态变化。

  2. clearOnScrollListeners():清除所有已设置的滚动监听器。

  3. addOnItemTouchListener(RecyclerView.OnItemTouchListener listener):添加一个项目触摸监听器,继承自RecyclerView.OnItemTouchListener类,可以通过重写其方法来监听RecyclerView中项目的触摸事件。

这些方法可以帮助开发者更灵活地监听RecyclerView的滚动和触摸事件,实现各种交互效果和功能。

刷新问题:
notifyDataSetChanged()//全部刷新
notifyltemChanged( position: 1)//某一个
notifyltemRangeChanged( positionStart: 0, itemCount: 3)//从某个开始刷新几个

得到当前页

findFirstCompletelyVisibleItemPosition

1
2
3
//得到当前页的index
val lm = binding.recyclerView.layoutManager as LinearLayoutManager
val index = lm.findFirstCompletelyVisibleItemPosition()

常用属性

  1. layoutManager: 用于设置 RecyclerView 的布局管理器,确定列表项的排列方式,如线性布局、网格布局等。
  2. adapter: 用于设置 RecyclerView 的适配器,绑定数据和视图,以便在列表中显示数据项。
  3. itemDecoration: 用于添加列表项的装饰,如分割线、间距等。
  4. itemAnimator: 用于设置列表项的动画效果,如添加、删除、移动等操作时的动画效果。
  5. scrollState: 用于获取 RecyclerView 的滚动状态,如SCROLL_STATE_IDLE(空闲状态)、SCROLL_STATE_DRAGGING(拖动状态)、SCROLL_STATE_SETTLING(自动滚动状态)。
  6. onScrollListener: 用于添加滚动监听器,监听 RecyclerView 的滚动事件。
  7. onItemClickListener: 用于设置列表项的点击事件监听器。
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信