Android UI 組件系列(八):ListView 基礎用法與適配器詳解

博客專欄: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;加密、響應封裝等輔助功能 項目核心功能包括用戶…