博客专栏:Android初级入门UI组件与布局

源码:通过网盘分享的文件:Android入门布局及UI相关案例

链接: https://pan.baidu.com/s/1EOuDUKJndMISolieFSvXXg?pwd=4k9n 提取码: 4k9n

一、引言

在上一篇文章《Android UI 组件系列(七):容器 NestedScrollView 的使用场景与协同滚动实战》中,我们讲解了 NestedScrollView 的滚动机制和嵌套使用方式。今天我们来继续深入容器组件系列,聊聊 Android 中最常见的列表组件之一——ListView。

尽管 RecyclerView 已成为更现代的列表解决方案,但 ListView 依然在不少老项目中被广泛使用,对于初学者理解 Android 的适配器机制和 UI 构建也非常重要。

二、ListView 的 UI 结构

在 Android 中,ListView 是一种用于显示垂直滚动列表的容器组件。它通过“适配器”将一组数据源映射到每一个列表项(Item)上,从而实现动态列表的展示。

ListView的XML布局

我们先来看一段最基础的 ListView 使用 XML 布局:

<!-- res/layout/activity_main.xml -->
<ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent"android:divider="@android:color/darker_gray"android:dividerHeight="1dp"/>

这段代码定义了一个占满整个屏幕的列表视图,并通过 divider 设置了分隔线颜色与高度。我们只需要给这个 ListView 设置一个适配器,它就可以根据数据动态生成对应数量的列表项。

ListView 的渲染逻辑

在运行时,ListView 会根据你设置的适配器(Adapter)来决定如何渲染每一项数据。整个流程大致如下:

数据源(List / 数组等)

     ↓

适配器(Adapter)

     ↓

生成每个 item 对应的 View(例如 TextView / 自定义布局)

     ↓

交由 ListView 管理显示、滚动、复用

常用的内置 item 布局

在使用 ArrayAdapter 等简单适配器时,Android 提供了一些默认的列表项布局:

  • android.R.layout.simple_list_item_1:只显示一行文本
  • android.R.layout.simple_list_item_2:显示主副两行文本
  • android.R.layout.simple_list_item_checked:带 CheckBox 的样式
  • android.R.layout.simple_list_item_single_choice:单选项样式
  • android.R.layout.simple_list_item_multiple_choice:多选项样式

通过不同的布局选择,你可以快速完成不同风格的列表 UI 原型。

示例:简单展示一个字符串列表

/// 配置ListViewprivate fun setupListView() {val listView = findViewById<ListView>(R.id.list_view)val data = listOf("北京", "上海", "广州", "深圳")val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, data)listView.adapter = adapter}

运行效果如下,每一行都是一个字符串。

三、ArrayAdapter、SimpleAdapter 快速上手

在 ListView 中展示数据的关键,就是选择合适的适配器(Adapter)。对于简单的字符串列表或图文混排效果,Android 提供了两个非常常用的适配器类:

  1. ArrayAdapter:用于展示一维字符串或对象列表;
  2. SimpleAdapter:用于展示键值对数据结构,支持图文混排。

使用 ArrayAdapter 展示文本列表

当你有一个字符串数组,或者只是想展示某个字段列表时,ArrayAdapter 是最简单的选择。

val data = listOf("苹果", "香蕉", "橘子")
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, data)
listView.adapter = adapter

simple_list_item_1 是系统提供的单行文本布局。你也可以替换成自己的布局资源。

这个效果在上面我们已经看过了。

使用 SimpleAdapter 实现图文混排

如果你希望每一行除了文字,还能显示图片,可以使用 SimpleAdapter。它支持将键值对映射到指定的控件上:

    /// 配置图文ListViewprivate fun setupImageTextListView() {val listView = findViewById<ListView>(R.id.list_view)val data = listOf(mapOf("title" to "微信", "icon" to R.drawable.ic_wechat),mapOf("title" to "QQ", "icon" to R.drawable.ic_qq))val adapter = SimpleAdapter(this,data,R.layout.list_item, // 自定义布局arrayOf("title", "icon"), // 数据中的 keyintArrayOf(R.id.text_view, R.id.image_view) // 映射到布局中的控件)listView.adapter = adapter}

示例中,list_item.xml 是我们自定义的布局文件,代码如下:

<!-- res/layout/list_item.xml -->
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:padding="10dp"><ImageViewandroid:id="@+id/image_view"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginEnd="10dp"/><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"/>
</LinearLayout>

效果如下:

四、设置点击事件、选中状态

ListView 除了展示内容,更常见的场景是需要响应用户的点击,比如跳转页面、更新 UI 或选中状态。

设置点击事件

我们可以通过 setOnItemClickListener 来监听列表项的点击事件:

listView.setOnItemClickListener { parent, view, position, id ->val selectedItem = parent.getItemAtPosition(position)Toast.makeText(this, "点击了:$selectedItem", Toast.LENGTH_SHORT).show()
}

常用参数说明:

  • position:当前点击的列表索引;
  • parent.getItemAtPosition(position):获取对应位置的数据项;
  • view:当前 item 对应的视图(可以进一步修改 UI);

设置选中状态(高亮)

如果你想让点击后的列表项有高亮效果,有两种常见方式:

方式一:使用系统自带的 listSelector

在 XML 中设置 ListView 的选择器属性:

<ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent"android:choiceMode="singleChoice"android:listSelector="@android:color/holo_blue_light"/>

方式二:自定义点击后改变 item 背景(适合自定义布局)

如果你使用自定义 item 布局,则可以在点击事件中手动修改背景:

listView.setOnItemClickListener { parent, view, position, id ->for (i in 0 until parent.childCount) {parent.getChildAt(i).setBackgroundColor(Color.WHITE)}view.setBackgroundColor(Color.LTGRAY)
}

注意:这种方式只适用于屏幕内可见的 item,不会持久记住“选中状态”,适合轻量使用。

通常我们需要配合修改数据状态,根据数据来设置选中状态或者其它状态。

五、简单列表展示 + 图文混排

前面我们已经了解了 ArrayAdapter 和 SimpleAdapter 的基础用法,也会给 ListView 设置点击事件。那么接下来我们就用一套完整的代码,实现一个带图标和文字的图文混排列表效果。

数据源定义

我们使用 List<Map<String, Any>> 的数据结构,每个 item 包含 title 和 icon 两个字段:

val data = listOf(mapOf("title" to "微信", "icon" to R.drawable.ic_wechat),mapOf("title" to "QQ", "icon" to R.drawable.ic_qq),mapOf("title" to "钉钉", "icon" to R.drawable.ic_dingding)
)

自定义布局 list_item.xml

放在 res/layout/list_item.xml 中,展示左图右文的横向结构:

<!-- res/layout/list_item.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"android:gravity="center_vertical"android:padding="10dp"><ImageViewandroid:id="@+id/image_view"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginEnd="16dp"android:scaleType="centerCrop" /><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="16sp"android:textColor="#333333" />
</LinearLayout>

绑定适配器

使用 SimpleAdapter 将数据与布局绑定:

val adapter = SimpleAdapter(this,data,R.layout.list_item,arrayOf("title", "icon"),intArrayOf(R.id.text_view, R.id.image_view)
)adapter.setViewBinder { view, data, _ ->if (view is ImageView && data is Int) {view.setImageResource(data)true} else {false}
}listView.adapter = adapter
⚠️ SimpleAdapter 默认不会处理图片资源,需要设置 setViewBinder 手动绑定图片。

设置点击事件

listView.setOnItemClickListener { _, _, position, _ ->val item = data[position]// 处理点击事件val title = item["title"] ?: "未知"Toast.makeText(this, "点击了: $title", Toast.LENGTH_SHORT).show()}

运行效果如下:

六、结语

本篇我们聚焦于 ListView 的基础使用方式,围绕其 UI 结构与适配器机制展开,主要介绍了以下内容:

✅ ListView 的布局结构与渲染逻辑;

✅ ArrayAdapter 适用于快速展示字符串列表;

✅ SimpleAdapter 可轻松实现图文混排展示;

✅ 如何监听点击事件与设置选中高亮;

✅ 结合完整示例,快速构建图文列表 UI;

虽然 ListView 的使用已经较为成熟,但它依然是理解 Android 列表机制、适配器模式、性能优化的良好入门途径。在项目初期阶段或快速原型开发中,ListView 仍具备一定实用价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916510.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916510.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916510.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android学习专题目录(持续更新)

1.Android 调试 1.1&#xff1a;Logcat日志分析 2.Android编译 2.1&#xff1a;android编译过程中的mk文件和bp文件的扫描机制 2.2&#xff1a;Android 构建系统中常见的 .mk 文件及其作用 2.3&#xff1a;Android构建系统中的mk文件语法函数 2.4&#xff1a;安卓中定…

c#Lambda 表达式与事件核心知识点整理

一、Lambda 表达式1. 概念 Lambda 表达式是一种匿名函数&#xff08;无名称的函数&#xff09;&#xff0c;简化了委托和匿名方法的写法&#xff0c;格式为&#xff1a; (参数列表) > 表达式或语句块 它可以作为参数传递&#xff0c;或赋值给委托类型变量。2. 基本语法与简写…

Springboot+Layui英语单词学习系统的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBootLayUI框架持久层框架MyBaits成功系统案例&#xff1a;参考代码数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续输…

主要分布于内侧内嗅皮层的层Ⅲ的边界向量细胞(BVCs)对NLP中的深层语义分析的积极影响和启示

边界向量细胞&#xff08;Boundary Vector Cells, BVCs&#xff09;主要分布于内侧内嗅皮层&#xff08;MEC&#xff09;层Ⅲ&#xff0c;通过编码环境边界&#xff08;如墙壁、障碍物&#xff09;的距离和方向信息&#xff0c;为空间导航提供几何参考框架。这一神经机制对自然…

Selenium是解决了什么问题的技术?

Selenium 是一种用于自动化浏览器操作的技术&#xff0c;主要解决了以下问题&#xff1a;1. 自动化测试 Selenium 最初是为了解决 Web 应用程序的自动化测试 问题而设计的。它可以帮助开发者和测试人员&#xff1a; 模拟用户操作&#xff1a;如点击按钮、填写表单、选择下拉菜单…

JavaSE知识点(2)

目录 访问修饰符的区别 this关键字的作用 抽象类和接口有什么区别 抽象类可以定义构造方法吗 但是接口不可以定义构造方法 Java支持多继承吗 接口可以多继承吗 继承和抽象的区别&#xff1f; 抽象类和普通类的区别 成员变量和局部变量的区别&#xff1f; staic关键字…

(实用教程)Linux操作系统(二)

centos配置静态ip 注意&#xff1a; 1.系统中的网关要与虚拟机编辑器中的网关保持一致 2.如果配置虚拟机编辑器后发现ping不通外网的时候&#xff0c;就要还原默认设置再进行配置 总结&#xff1a; 虚拟机编辑器需要配置ip&#xff0c;网关&#xff0c;其中ip网段以及最后一…

ThinkPHP8集成RabbitMQ的完整案例实现

ThinkPHP8集成RabbitMQ的完整案例实现一、安装依赖&#xff1a;需通过Composer安装php-amqplib库‌二、配置RabbitMQ三、生产者1、发送一个邮件&#xff0c;将任务发送到RabbitMQ队列中。2、运行结果展示四、启动消费者&#xff1a;命令行执行php think rabbitmq:consumer1&…

解密负载均衡:如何轻松提升业务性能

什么是负载均衡 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&#xff0c;从而提高了 公司业务的…

mac neo4j install verifcation

本文使用conda环境安装&#xff0c;neo4j所依赖jdk也采用conda install的方式安装。 1 neo4j下载 点击如下链接&#xff0c;选择community, Linux/Mac Executor&#xff0c;点击Download Community。 本文下载的安装包是 neo4j-community-2025.06.2-unix.tar.gz 2 安装neo4j …

【Oracle】Oracle分区表“排雷“指南:当ORA-14400错误找上门时如何优雅应对

引言&#xff1a;分区表里的"定时炸弹"凌晨三点的机房&#xff0c;你盯着屏幕上刺眼的ORA-14400: 插入的分区键值超出所有分区范围错误&#xff0c;后背发凉。这个错误就像埋在分区表里的定时炸弹&#xff0c;一旦触发就会让整个应用瘫痪。但别慌&#xff01;本文将带…

设计模式(十四)行为型:职责链模式详解

设计模式&#xff08;十四&#xff09;行为型&#xff1a;职责链模式详解职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是 GoF 23 种设计模式中的行为型模式之一&#xff0c;其核心价值在于将多个处理对象&#xff08;处理器&#xff09;连接成一条链&am…

WAIC 2025 热点解读:如何构建 AI 时代的“视频神经中枢”?

一、&#x1f310; WAIC 2025 大会看点&#xff1a;AI 正在“长出眼睛与身体” 在 2025 年的人工智能大会&#xff08;WAIC 2025&#xff09;上&#xff0c;“大模型退幕后&#xff0c;具身智能登场”成为最具共识的趋势转向。从展区到主论坛&#xff0c;再到各大企业发布的新…

OpenCV+Python

安装 OpenCV&#xff1a; Python&#xff1a;直接 pip install opencv-python&#xff08;核心库&#xff09;和 opencv-contrib-python&#xff08;扩展功能&#xff09;。 pip install opencv-python pip install opencv-contrib-python 验证安装&#xff1a; import cv2…

现代C++的一般编程规范

一般情况下不要使用std::endl&#xff0c;尤其是在循环中&#xff0c;因为可能一开始你只是想要打印一个换行符&#xff0c;但是"endl"做的更多&#xff0c;其还会刷新缓冲区&#xff0c;这会额外花费很多时间&#xff0c;相反&#xff0c;只需要使用“\n"&…

38.安卓逆向2-frida hook技术-过firda检测(三)(通过SO文件过检测原理)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

创建属于自己的github Page主页

安装手册 安装手册 环境要求 Node.js version 18.0 安装 Node.js 时&#xff0c;建议勾选所有和依赖相关的选项。 安装步骤 安装 Docusaurus 最简单的方法是使用 create-docusaurus 命令行工具&#xff0c;它可以帮助你快速搭建一个 Docusaurus 网站的基础框架。 你可以在…

Unity Catalog与Apache Iceberg如何重塑Data+AI时代的企业数据架构

在2025年DataAI Summit上&#xff0c;Databricks发布了一系列重大更新&#xff0c;标志着企业数据治理进入新阶段。其中&#xff0c;Unity Catalog的增强功能和对Apache Iceberg的全面支持尤为引人注目。这些更新不仅强化了跨平台数据管理能力&#xff0c;还推动了开放数据生态…

雨季,汽车经常跑山区,该如何保养?

雨季来临&#xff0c;山区道路变得湿滑难行&#xff0c;频繁穿梭于此的汽车面临着前所未有的挑战。如何在这样恶劣的环境中确保爱车安然无恙&#xff1f;本文将为你详细解析雨季经常跑山区的汽车该如何保养&#xff0c;让你在遭遇突发状况时也能从容应对。当雨季遇上山区路况&a…

Spring Boot音乐服务器项目-查询音乐模块

一、项目架构概览 该音乐播放服务器采用经典的MVC分层架构&#xff0c;核心模块包括&#xff1a; 实体层&#xff1a;定义数据模型Mapper层&#xff1a;数据库操作接口Controller层&#xff1a;HTTP请求处理工具层&#xff1a;加密、响应封装等辅助功能 项目核心功能包括用户…