01_RecyclerView介绍和使用

200 阅读2分钟

1. RecyclerView简介

RecyclerView是Android系统提供的一个更为灵活和高效的用于显示大量数据的控件。相比于ListView,RecyclerView引入了更多的优化和扩展,允许开发者在展示大数据量时获得更好的性能和体验。

RecyclerView的优点

  1. 更高的性能:RecyclerView通过回收和重用视图来提高性能,减少了视图的创建和绑定次数。
  2. 更灵活的布局管理:通过LayoutManager,可以实现多种不同的布局方式,如线性布局、网格布局和瀑布流布局。
  3. 更强的可定制性:开发者可以自定义Item动画和分割线,提升用户体验。
  4. ViewHolder模式:强制使用ViewHolder模式,提升了代码的可读性和性能。

重要成员介绍

  1. RecyclerView.Adapter:负责将数据与视图进行绑定,并处理视图的回收和重用。
  2. LayoutManager:管理RecyclerView中Item的布局。
  3. ItemDecoration:用于在Item之间添加分割线或装饰。
  4. ItemAnimator:处理RecyclerView中Item的动画效果。
  5. Item点击事件:需要自己实现。

2. RecyclerView的基本使用步骤

1. 添加依赖

在项目的build.gradle文件中添加RecyclerView的依赖:

dependencies {
    implementation "androidx.recyclerview:recyclerview:1.2.1"
}

2. 创建布局文件

Activity的布局文件:

<!-- res/layout/activity_recycler_view_basic.xml -->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
    <androidx.recyclerview.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recyclerView" />
</androidx.constraintlayout.widget.ConstraintLayout>

Item的布局文件:

<!-- res/layout/item_text.xml -->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#7F91FF">
    <androidx.appcompat.widget.AppCompatTextView android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:textColor="#FFFFFF" android:textSize="15sp"
        app:layout_constraintTop_toTopOf="parent" tools:text="item" />
</androidx.constraintlayout.widget.ConstraintLayout>

3. 创建ViewHolder和Adapter

class BasicAdapter(data: MutableList<String>? = null) : RecyclerView.Adapter<BasicAdapter.MyViewHolder>() {

    private var mData = data ?: mutableListOf()

    /**
     * 创建ViewHolder
     */
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_text, parent, false)
        return MyViewHolder(view)
    }

    /**
     * 绑定数据
     */
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.textView.text = mData[position]
    }

    /**
     * 获取Item数量
     */
    override fun getItemCount(): Int {
        return mData.size
    }

    @SuppressLint("NotifyDataSetChanged")
    fun setNewData(data: MutableList<String>?) {
        mData = data ?: mutableListOf()
        notifyDataSetChanged()
    }

    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val textView: TextView = itemView.findViewById(R.id.textView)
    }
}

4. 使用RecyclerView

在Activity或Fragment中初始化RecyclerView,设置LayoutManager和Adapter:

class RecyclerViewBasicActivity : AppCompatActivity() {

    private val mAdapter = BasicAdapter()

    override fun onCreate(savedInstanceState: android.os.Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_recycler_view_basic)

        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.adapter = mAdapter

        bindData()
    }

    private fun bindData() {
        val data: MutableList<String> = getData()
        mAdapter.setNewData(data)
    }

    private fun getData(): MutableList<String> {
        val data = mutableListOf<String>()
        for (i in 0..10) {
            data.add("Item $i")
        }
        return data
    }
}

3. RecyclerView的高级用法

1. 自定义Item动画

RecyclerView允许自定义列表项的添加、删除、移动动画,通过实现ItemAnimator类可以实现自定义动画效果:

recyclerView.itemAnimator = DefaultItemAnimator()

2. 使用不同的LayoutManager

除了常用的LinearLayoutManager,RecyclerView还支持GridLayoutManager和StaggeredGridLayoutManager:

recyclerView.layoutManager = GridLayoutManager(this, 2)
// 或者
recyclerView.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)

3. 添加分割线

通过ItemDecoration类可以为RecyclerView添加分割线:

val itemDecoration = DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
recyclerView.addItemDecoration(itemDecoration)

4. Item点击事件

定义点击事件回调接口

public interface OnItemClickListener {
    void onItemClick(@NonNull RecyclerView.Adapter<?> adapter, @NonNull View view, int position);
}

在Adapter中实现点击事件

class BasicAdapter(data: MutableList<String>? = null) : RecyclerView.Adapter<BasicAdapter.MyViewHolder>() {

    private var mOnItemClickListener: OnItemClickListener? = null

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // ...

        holder.itemView.setOnClickListener {
            mOnItemClickListener?.onItemClick(this, it, position)
        }
    }

    fun setOnItemClickListener(listener: OnItemClickListener?) {
        this.mOnItemClickListener = listener
    }
}

在Activity中设置Item点击事件

class RecyclerViewBasicActivity : AppCompatActivity() {

    private val mAdapter = BasicAdapter()

    override fun onCreate(savedInstanceState: android.os.Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_recycler_view_basic)

        // ...

        mAdapter.setOnItemClickListener { _, _, position ->
            Toast.makeText(this@RecyclerViewBasicActivity, "点击了第${position}个Item", Toast.LENGTH_SHORT).show()
        }
    }
}

4. 总结

RecyclerView是一个强大且灵活的控件,适用于展示大数据量的列表。通过灵活运用LayoutManager、ItemAnimator和ItemDecoration等组件,开发者可以轻松创建高性能、可定制的列表界面。掌握RecyclerView的使用,将极大地提升你的Android开发能力。