Android中RecyclerView基本使用

一、RecyclerView 核心概念

1. 基本組件關系

2. 核心組件作用
  • Adapter:數據與視圖的橋梁

  • LayoutManager:控制布局方式(線性/網格/瀑布流)

  • ViewHolder:緩存視圖組件

  • ItemDecoration:添加分割線等裝飾

  • ItemAnimator:處理增刪動畫


二、基礎使用流程

1. 添加依賴
implementation 'androidx.recyclerview:recyclerview:1.3.2'
2. XML布局
<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"/>
3. 實現 Adapter
class MyAdapter(private val data: List<String>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {// 創建 ViewHolderoverride fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)return MyViewHolder(view)}// 綁定數據override fun onBindViewHolder(holder: MyViewHolder, position: Int) {holder.bind(data[position])}override fun getItemCount() = data.size// ViewHolder 定義inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {private val textView: TextView = itemView.findViewById(R.id.tv_item)fun bind(item: String) {textView.text = item}}
}
4. 設置 RecyclerView
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(listOf("Item 1", "Item 2", "Item 3"))

三、ViewHolder 生命周期詳解

關鍵生命周期方法:

  1. onCreateViewHolder():創建新視圖

  2. onBindViewHolder():綁定數據

  3. onViewAttachedToWindow():視圖進入屏幕

  4. onViewDetachedFromWindow():視圖離開屏幕

  5. onViewRecycled():視圖進入回收池(可在此釋放資源)


四、性能優化策略

1. 基礎優化
// 設置固定尺寸提升測量效率
recyclerView.setHasFixedSize(true) // 增加緩存數量(默認=2)
recyclerView.itemViewCacheSize = 10
2. 高效數據綁定
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {// 使用 payload 實現局部更新holder.bind(data[position])
}// 使用 DiffUtil 智能更新
val diffResult = DiffUtil.calculateDiff(MyDiffCallback(oldList, newList))
diffResult.dispatchUpdatesTo(adapter)
3. 視圖復用優化
// Adapter 中重寫 getItemViewType()
override fun getItemViewType(position: Int): Int {return when (data[position].type) {ItemType.TEXT -> 0ItemType.IMAGE -> 1}
}// 根據 viewType 創建不同 ViewHolder
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) {return when (viewType) {0 -> TextViewHolder(...)1 -> ImageViewHolder(...)}
}
4. 圖片加載優化
fun bind(item: Item) {Glide.with(itemView).load(item.imageUrl).apply(RequestOptions().override(100, 100)) // 限制尺寸.into(imageView)
}override fun onViewRecycled() {Glide.with(itemView).clear(imageView) // 及時釋放
}

五、事件監聽實現

1. 點擊事件處理
// 在 ViewHolder 中設置監聽
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {init {itemView.setOnClickListener {val pos = adapterPositionif (pos != RecyclerView.NO_POSITION) {// 通過接口回調事件listener?.onItemClick(pos)}}}
}// 定義回調接口
interface OnItemClickListener {fun onItemClick(position: Int)
}
2. 長按事件
itemView.setOnLongClickListener {val pos = adapterPositionif (pos != RecyclerView.NO_POSITION) {listener?.onItemLongClick(pos)true} else false
}
3. 滑動監聽
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {// dy > 0:向上滾動// dy < 0:向下滾動}override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {when (newState) {RecyclerView.SCROLL_STATE_IDLE -> { /* 停止滾動 */ }RecyclerView.SCROLL_STATE_DRAGGING -> { /* 用戶拖動 */ }RecyclerView.SCROLL_STATE_SETTLING -> { /* 慣性滑動 */ }}}
})

六、高級技巧

1. 嵌套滾動優化
<!-- 子RecyclerView設置 -->
android:nestedScrollingEnabled="false"
2. 預加載實現
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {val lastVisible = (layoutManager as LinearLayoutManager).findLastVisibleItemPosition()if (lastVisible > itemCount - 5) {// 觸發預加載}}
})
3. 高效更新策略
// 使用 ListAdapter 自動處理差異更新
class MyAdapter : ListAdapter<Item, MyViewHolder>(DiffCallback()) {// 自動計算差異更新
}class DiffCallback : DiffUtil.ItemCallback<Item>() {override fun areItemsTheSame(old: Item, new: Item) = old.id == new.idoverride fun areContentsTheSame(old: Item, new: Item) = old == new
}

最佳實踐總結

  1. ViewHolder模式:必須使用避免重復findViewById

  2. 局部更新:優先使用DiffUtil/ListAdapter

  3. 資源釋放:在onViewRecycled()中釋放圖片等資源

  4. 事件委托:通過接口回調代替在Adapter中處理邏輯

  5. 類型區分:多類型視圖使用getItemViewType()

  6. 內存監控:使用Profiler檢測滾動時的內存波動

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92450.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

A100用transformers推理gpt-oss

A100本地用transformers推理gpt-oss GPT-oss試用 gpt-oss有兩個原生配置是目前&#xff08;2025-8-8&#xff09;Ampere系列顯卡不支持的&#xff0c;分別是默認的MXFP4量化&#xff0c;以及Flash-attn V3。tranformers推理是比較慢的&#xff0c;可以用于研究模型本身&#x…

虛擬手機號工具使用

背景&#xff1a;注冊部分國外應用時需要國外手機號驗證&#xff0c;例如在注冊cursor時需要國外手機號 解決&#xff1a;使用虛擬手機號網頁進行驗證 https://temp-number.com/ 選擇自己需要的國家 選擇一個手機號 復制手機號到自己的app注冊頁面 并發送消息&#xff0c;然后…

【線程池】壓測確定線程池合適的參數

【線程池】壓測確定線程池合適的參數【一】案例說明【二】明確線程池核心參數及優化目標【1】線程池核心參數&#xff08;需壓測驗證的關鍵參數&#xff09;【2】優化目標【三】壓測前準備【1】環境搭建【2】線程池初始配置&#xff08;基于經驗值&#xff09;【3】壓測工具與監…

GPT OSS 雙模型上線,百度百舸全面支持快速部署

GPT OSS 是 OpenAI 推出的重量級開放模型&#xff0c;專為強推理能力、智能體任務及多樣化開發場景設計&#xff0c;標志著大模型在開放性與實用性上的重要突破。該系列包含兩款高性能模型&#xff1a;參數規模為 117B 的 GPT?OSS?120B 和 21B 的 GPT?OSS?20B。二者皆采用 …

C++高頻知識點(十七)

文章目錄81. 你對智能指針的了解82. 一元、二元仿函數的區別和使用背景一元仿函數二元仿函數83. 描述Linux下文件刪除的原理84. 什么是菱形繼承&#xff1f;有什么問題&#xff0c;怎么解決&#xff1f;解決菱形繼承問題85. IO多路復用是什么&#xff1f;selectpollepollselect…

如何優雅的使用進行參數校驗

在spring里面有一個注解 Validated可以在方法的入參里面這樣寫//方法 getActivityFlag(RequestBody Validated QueryActivityDto queryActivityDto) //參數詳情NotBlank(message "userId不能為空")private String userId;NotNull(message "storeId不能為空&q…

Java學習第一百一十部分——CI/CD

目錄 一、前言簡介 二、基本信息 三、優勢價值 四、核心流程 五、技術棧&#xff08;工具矩陣&#xff09; 六、最佳實踐 七、與DevOps關系 八、挑戰對策 九、使用建議 十、總結歸納 一、前言簡介 CI/CD 的本質是&#xff1a;通過自動化流水線&#xff0c;實現代碼從提…

關于 Cocoapods 使用

一、Podfile & .podspec 文件 1、Podfile 1.1. 什么是 pod 簡單來說&#xff0c;一個 pod 就是 xcode 里面的一個 dependency&#xff1a; Anyway&#xff0c;pod 就是第三方庫的意思。一個 pod 就是指一個第三方庫。 1.2. Podfile 有什么用 Podfile 可以理解為就是…

編程速遞:2025 年巴西 Embarcadero 會議,期待您的到來

每個英雄都有一段充滿奮斗的旅程&#xff0c;這段旅程引領他走向榮耀&#xff0c;而開發者英雄的旅程是2025年巴西Embarcadero大會的重點&#xff0c;以慶祝Delphi成立30周年。網站現已上線巴西Embarcadero在世界上最受期待的Delphi發展英雄會議召開前90天&#xff0c;推出了Em…

DevOps簡單教程應用

文章目錄概念一、環境準備二、gitlab配置三、.gitlab-ci.yml文件配置概念 Devops是一個概念&#xff0c;就是邊開發邊測試&#xff0c;能夠大大提升開發效率&#xff0c;本文使用pycharmgitlab實現一個簡單的DevOps流程 一、環境準備 需要一個測試環境&#xff0c;模擬部署&…

華為流程管理體系構建與落地 之—— 業務流程規劃【附全文閱讀】

這部分內容聚焦華為業務流程管理&#xff0c;詳細闡述了流程規劃、設計、運營、評估與優化的具體方法和內容&#xff0c;為企業構建和完善流程管理體系提供了全面的指導。流程規劃分類方法&#xff1a;介紹 POS、OES、OMS 等分類法&#xff0c;如 POS 法按規劃、運營、支持劃分…

Android 項目:畫圖白板APP開發(零)——功能介紹(筆鋒,分頁,縮放,多指,硬件加速等)

一、前言 本系列將全面的介紹一些有關Android 畫圖方面的知識。筆觸功能包括&#xff1a;顏色、粗細、透明度、筆鋒、橡皮&#xff1b;繪圖功能包括&#xff1a;分頁、縮放、多指、撤銷恢復、筆畫加速。別看功能這么多&#xff0c;簡單的部分會花較少篇幅介紹&#xff0c;著重會…

香橙派 RK3588 部署千問大模型 Qwen2-VL-2B 推理視頻

演示視頻 香橙派RK3588部署千問大模型Qwen2-VL-2B推理視頻一、場景假設 視頻輸入為一條網絡流&#xff0c;利用大模型對視頻中的圖像幀進行推理。由于大模型推理耗時長&#xff0c;無法對每幀都進行推理&#xff0c;因此采用跳幀推理的方式&#xff1a;當推理完一幀后&#xf…

排序概念以及插入排序

一、排序基本概念1.就地排序&#xff1a;使用恒定的額外空間來產生輸出就地排序只是在原數組空間進行排序處理&#xff0c;也就是輸入的數組和得到的數組是同一個2.內部排序和外部排序&#xff1a;待排序數據可以一次性載入到內存中為內部排序&#xff0c;反之數據量過大就是外…

Webpack 核心配置與最佳實踐指南

Webpack 是現代前端工程化的核心工具,理解其配置原理和優化技巧對開發效率至關重要。 一、Webpack 基礎架構 1、核心概念關系圖 2、核心概念詳解 概念 作用 示例配置 Entry 應用入口起點 entry: ‘./src/index.js’ Output 編譯結果輸出位置 output.path: path.resolve(__d…

GISBox私有云+SaaS:安全協同的地理智能平臺

一、概述 GISBox&#xff08;GIS 工具箱&#xff09;是一套能夠對GIS 影像、地形、傾斜攝影進行場景編輯、切片轉化、分發服務的 GIS 工具箱。同時&#xff0c;GISBox還支持私有云并一鍵開啟SaaS服務。 二、什么是私有云&#xff1f; 私有云服務是一種為企業或組織量身定制的…

代理人工智能的隱藏威脅

代理型人工智能的自主性令人興奮&#xff0c;但事實并非如此。主動性越高&#xff0c;不可預測性就越強&#xff0c;這為嚴重的、往往被忽視的安全風險打開了大門。從指令劫持到數字供應鏈的連鎖故障&#xff0c;代理型人工智能不僅智能&#xff0c;而且在不受控制的情況下非常…

SonarQube 掃描多個微服務模塊

SonarQube 掃描多個微服務模塊 在使用 SonarQube/SonarCloud 掃描多個微服務模塊時&#xff0c;核心目標是??確保每個微服務模塊被獨立分析??&#xff0c;并在 SonarQube 界面中以獨立項目展示結果。以下是具體實現方案&#xff0c;分場景說明&#xff1a; ??一、前提條…

當前主流且經過市場驗證的開源 BI 系統推薦

以下是當前主流且經過市場驗證的開源 BI 系統推薦&#xff0c;結合技術特性、適用場景和行業實踐&#xff0c;為不同需求提供針對性解決方案&#xff1a;一、綜合型開源 BI 平臺1. Apache Superset&#xff08;Apache 2.0 協議&#xff09;核心優勢&#xff1a;全場景覆蓋&…

第05章 排序與分頁

1.排序數據 1.1 排序規則 1.2 單列排序 1.3 多列排序 2.分頁 2.1 背景 背景1:查詢返回的記錄太多了,查看起來很不方便,怎么樣能夠實現分頁查詢呢? 背景2:表里有 4 條數據,我們只想要顯示第 2、3 條數據怎么辦呢? 2.2 實現規則 分頁原理:所謂分頁顯示,就是將數據…