内容概述

本章节学习内容的代码链接: 联系人列表ContactListApp

在这一节中,我们将学习如何使用 RecyclerView 来显示列表数据,并了解适配器的作用。RecyclerView 是一种灵活且高效的控件,适合用于展示大量数据。

1. RecyclerView 的介绍

  • RecyclerView 是一种用于展示滚动列表的高级控件。
  • 优点:
    • 视图复用,减少内存使用。
    • 支持多种布局管理器(如线性布局、网格布局等)。
    • 提供更强大的自定义功能。

2. 创建项目

  1. 打开 Android Studio,选择 “新建项目”。
  2. 选择项目模板
    • 选择 “Empty Activity”。
  3. 配置项目
    • 项目名称:ContactListApp
    • 包名:com.example.contactlist
    • 语言选择:Kotlin
    • 最小API级别:API 21: Android 5.0 (Lollipop)
  4. 点击“完成”,等待项目生成。

3. 添加 RecyclerView 依赖

build.gradle(Module: app)中添加 RecyclerView 依赖:

dependencies {
    implementation 'androidx.recyclerview:recyclerview:1.3.0'
}

点击“Sync Now”同步依赖。

4. 更新布局文件

打开 activity_main.xml,添加 RecyclerView 控件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

5. 创建数据模型

com.example.contactlist 包中创建一个数据模型类 Contact.kt

data class Contact(val name: String)

6. 创建适配器

在同一包中创建 ContactAdapter.kt,实现适配器:

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class ContactAdapter(private val contactList: List<Contact>) : RecyclerView.Adapter<ContactAdapter.ViewHolder>() {

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val textView: TextView = view.findViewById(android.R.id.text1)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(android.R.layout.simple_list_item_1, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.textView.text = contactList[position].name
    }

    override fun getItemCount() = contactList.size
}

7. 在 MainActivity 中设置 RecyclerView

打开 MainActivity.kt,设置 RecyclerView

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class MainActivity : AppCompatActivity() {

    private lateinit var recyclerView: RecyclerView
    private lateinit var contactAdapter: ContactAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)

        // 模拟数据
        val contacts = listOf(
            Contact("Alice"),
            Contact("Bob"),
            Contact("Charlie"),
            Contact("David"),
            Contact("Eve"),
            Contact("Frank"),
            Contact("Grace"),
            Contact("Hannah"),
            Contact("Ivan"),
            Contact("Jack")
        )

        contactAdapter = ContactAdapter(contacts)
        recyclerView.adapter = contactAdapter
    }
}

8. 运行应用

  1. 点击“运行”按钮。
  2. 选择一个模拟器或连接的设备。
  3. 观察应用显示的联系人列表。

详细解释

  • RecyclerView:用于显示数据列表,通过适配器将数据和视图绑定。

  • ContactAdapter

    • onCreateViewHolder:创建视图持有者,加载布局。
    • onBindViewHolder:将数据绑定到视图上。
    • getItemCount:返回数据项的数量。
  • 模拟数据:在 MainActivity 中创建一个包含联系人姓名的列表并传递给适配器。

我们实现了一个简单的联系人列表应用 (ContactListApp),它展示了一组联系人的名字。下面是如何实现这个功能的详细解释,包括各个代码之间的关系及实现原理。

实现原理

  1. 数据准备:在 MainActivity 中,创建一个联系人列表 contacts,包含多个 Contact 对象。
  2. 适配器设置:将 contacts 列表传递给 ContactAdapter 实例,并设置为 RecyclerView 的适配器。
  3. 视图创建与绑定
    • 当 RecyclerView 显示时,会首先调用 onCreateViewHolder 创建新视图。
    • 随后调用 onBindViewHolder 将联系人数据绑定到视图中。
  4. 列表展示:最终,RecyclerView 将显示所有联系人的姓名,形成一个列表。

1. 数据模型 (Contact)

data class Contact(val name: String)
  • 功能:这是一个数据类,用于表示单个联系人。它包含一个属性 name,表示联系人的名字。
  • 关系:这个类在应用中用于创建联系人对象的列表,后续的适配器会使用这些对象来展示数据。

2. 适配器 (ContactAdapter)

class ContactAdapter(private val contactList: List<Contact>) : RecyclerView.Adapter<ContactAdapter.ViewHolder>() {
  • 功能:适配器负责将 Contact 数据模型与 RecyclerView 连接。它继承自 RecyclerView.Adapter,需要实现三个主要方法。
  • 关系
    • contactList:通过构造函数传入的联系人列表,用于在适配器中访问和显示数据。
    • 适配器的工作是将 contactList 中的数据转换为可以在 RecyclerView 中显示的视图。

3. ViewHolder (ViewHolder)

class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
    val textView: TextView = view.findViewById(android.R.id.text1)
}
  • 功能ViewHolder 是一个内部类,用于缓存 RecyclerView 的每一项视图。它提高了性能,避免了重复查找视图。
  • 关系:在适配器中,当创建一个新的视图时,会生成一个 ViewHolder 实例并返回。这个持有者缓存了列表项的视图引用(textView)。

4. 创建视图 (onCreateViewHolder)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(parent.context)
        .inflate(android.R.layout.simple_list_item_1, parent, false)
    return ViewHolder(view)
}
  • 功能:当 RecyclerView 需要新项时,调用这个方法创建一个新的视图持有者。
  • 关系:它加载了一个简单的列表项布局并将其传递给 ViewHolder,这样就可以在后续的绑定数据时使用。

5. 数据绑定 (onBindViewHolder)

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.textView.text = contactList[position].name
}
  • 功能:此方法在 RecyclerView 中显示每个项目的数据。它会在需要更新视图时被调用。
  • 关系:通过 position 参数,可以获取联系人列表中相应位置的联系人对象,并将其姓名设置到 textView 上。

6. 获取项目数量 (getItemCount)

override fun getItemCount() = contactList.size
  • 功能:返回联系人列表的大小,以告诉 RecyclerView 有多少项需要显示。
  • 关系:这个方法与适配器的其他方法(如 onCreateViewHolderonBindViewHolder)密切相关,确保 RecyclerView 知道何时创建新项以及何时绑定数据。

总结

通过本节的学习,你已经掌握了如何使用 RecyclerView 显示列表数据,并实现了一个简单的联系人列表应用。你可以在此基础上添加更多功能,例如点击事件、搜索功能等。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐