RecyclerView vs. LazyRow/LazyColumn: 为 Android 中的动态列表选择合适的布局

183 篇文章 14 订阅
34 篇文章 1 订阅

在 Android 应用程序中显示动态列表时,开发者经常面临选择 RecyclerView 和 LazyRow/LazyColumn 之间的决策。RecyclerView 已经成为 Android 开发中的重要组件很长一段时间了,而 LazyRow 和 LazyColumn 是在 Jetpack Compose 中相对较新的组件。在本文中,我们将探讨 RecyclerView 和 LazyRow/LazyColumn 之间的区别、它们的优势以及考虑因素,帮助您为应用程序的布局需求做出明智的决策。

Android 中的 RecyclerView

RecyclerView 是一个功能强大且灵活的组件,通过回收和重用视图来高效处理大型数据集。它提供了项目布局的灵活性,并支持流畅滚动、项目动画和视图持有者等功能。RecyclerView 在传统的基于 View 的系统内运作,并在 Android 开发中被广泛用于创建复杂和动态的列表。让我们看一个在 Android 中使用 RecyclerView 的示例:

<!-- item_layout.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:padding="8dp" />
</LinearLayout>
// RecyclerView Adapter
class MyAdapter(private val dataList: List<String>) :
    RecyclerView.Adapter<MyAdapter.ViewHolder>() {

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

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = dataList[position]
        holder.textView.text = item
    }

    override fun getItemCount(): Int {
        return dataList.size
    }
}

// 使用示例
val recyclerView: RecyclerView = findViewById(R.id.recycler_view)
val adapter = MyAdapter(dataList)
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)

在上面的示例中,我们定义了一个自定义的 RecyclerView 适配器来填充数据列表。适配器从 item_layout.xml 文件中膨胀出项目视图,并将数据绑定到它们上。RecyclerView 设置了一个 LinearLayoutManager,以线性垂直或水平布局显示项目。

Jetpack Compose 中的 LazyRow/LazyColumn

LazyRow 和 LazyColumn 是 Jetpack Compose 的一部分,Jetpack Compose 是用于构建 Android 应用程序的现代 UI 工具包。它们提供了一种声明式的方式来创建动态列表,并且相比 RecyclerView 来说更加高效和易用。LazyRow 横向排列项目,而 LazyColumn 纵向排列项目。让我们看一个在 Jetpack Compose 中使用 LazyColumn 的示例:

// Jetpack Compose 中的使用示例
@Composable
fun MyList(dataList: List<String>) {
    LazyColumn {
        items(dataList) { item ->
            Text(text = item)
        }
    }
}

// 使用示例
val dataList = listOf("Item 1", "Item 2", "Item 3")
setContent {
    MyList(dataList)
}

在上面的示例中,我们定义了一个组合函数 MyList,它以字符串列表作为输入。在 LazyColumn 内部,我们使用 items 函数遍历列表,并为每个项目创建一个 Text 组合。

对比

开发体验

RecyclerView 需要编写更多的代码,并涉及到管理视图持有者、适配器和布局管理器。而 LazyRow/LazyColumn 则利用了 Jetpack Compose 的声明式方法,使代码更简洁、更简单。

性能和效率

RecyclerView 以其视图回收和高效滚动等性能优化而在 Android 开发中广受称赞。然而,在 Jetpack Compose 中的 LazyRow/LazyColumn 是使用现代渲染技术构建的,它们也提供了出色的性能、流畅的滚动和高效的内存使用。

灵活性

RecyclerView 在自定义项目布局、处理不同项目类型和集成复杂动画方面提供了更多的灵活性。而 LazyRow/LazyColumn 虽然更简化,但在自定义选项方面可能存在一定的限制。

学习曲线

RecyclerView 是一个成熟的组件,在 Android 开发中得到广泛应用,因此更容易找到相关资源和社区支持。而 LazyRow/LazyColumn 作为 Jetpack Compose 中相对较新的组件,可能需要开发者熟悉 Compose 框架。

结论

在为 Android 的动态列表选择 RecyclerView 和 LazyRow/LazyColumn 时,需要考虑项目的具体要求和限制。RecyclerView 提供了一个成熟且功能丰富的解决方案,具有更多的自定义选项和广泛的社区支持。而 LazyRow/LazyColumn 提供了更简化和高效的方法,具有更简洁的代码和出色的性能,尤其在使用 Jetpack Compose 时。

如果您正在开始一个新项目或采用 Jetpack Compose,LazyRow/LazyColumn 可能是一个不错的选择。对于现有项目或复杂的列表需求,RecyclerView 仍然是一个可靠且灵活的选项。最终,了解权衡和考虑开发体验、性能和项目背景等因素,将帮助您为应用程序的动态列表布局需求做出明智的决策。

转自:RecyclerView vs. LazyRow/LazyColumn: 为 Android 中的动态列表选择合适的布局

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# -*- coding: UTF-8 -*- from lib2to3.pgen2 import driver from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="通讯录") el1.click() el2 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.FrameLayout[3]/android.widget.RelativeLayout") el2.click() el3 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[1]/android.widget.TextView") el3.click() el4 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[8]") el4.click() el5 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[11]") el5.click()
06-08
根据你提供的代码,看起来你使用了 `lib2to3.pgen2.driver` 模块的 `find_element` 方法。但是,`lib2to3.pgen2.driver` 模块实际上并没有这个方法,所以出现了 `AttributeError`。 我猜测你可能是想使用 Appium 的 `driver.find_element` 方法。如果是这样的话,你需要更改你的代码来正确导入 `appium.webdriver` 模块并使用它的 `driver` 属性。具体的修改如下: ```python # -*- coding: UTF-8 -*- from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy # 创建 Appium driver desired_caps = {} desired_caps['platformName'] = 'Android' # 添加其他的 desired capabilities 选项... driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 执行测试操作 el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="通讯录") el1.click() el2 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.FrameLayout[3]/android.widget.RelativeLayout") el2.click() el3 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[1]/android.widget.TextView") el3.click() el4 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[8]") el4.click() el5 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[11]") el5.click() # 关闭 driver driver.quit() ``` 注意,这里我使用了 `appium.webdriver` 模块的 `webdriver.Remote` 方法来创建 driver,然后使用 `driver.find_element` 方法来查找元素。最后,在测试结束后,我也关闭了 driver。你需要根据你的具体情况修改代码的 `desired_caps` 和元素定位方式等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值