ListView[new]

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"xmlns:tools="http://schemas.android.com/tools"><ListViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/lv"tools:listitem="@layout/myitem"/>
</LinearLayout>

myitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"tools:ignore="UseCompoundDrawables"><ImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:id="@+id/iv" /><TextViewandroid:layout_width="match_parent"android:layout_height="100dp"android:id="@+id/tv" />
</LinearLayout>

MainActivity.kt

class Item(val name:String, val imageId: Int){
}
class myAdapter(activity: Activity, val resourceId: Int, data: List<Item>) :ArrayAdapter<Item>(activity, resourceId, data) {inner class ViewHolder(val fruitImage: ImageView, val fruitName: TextView)// inner表示內部類override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {val view: Viewval viewHolder: ViewHolder//通過緩存列表項的視圖對象來避免重復創建和填充視圖,從而提高列表的滑動性能//具體來說,ViewHolder 模式包含兩個部分://1.ViewHolder 類:用于保存列表項中的子視圖對象,例如 TextView、ImageView 等。// 通過保存子視圖對象,可以避免在每次滑動列表時都重新查找子視圖對象,提高列表的滑動性能。////2.getView() 方法:在 getView() 方法中,我們可以通過 convertView 參數來獲取之前創建的視圖對象,//并將其傳遞給 ViewHolder 對象。如果 convertView 不為空,則表示可以重用該視圖對象,// 否則需要創建新的視圖對象。通過重用視圖對象,可以避免重復創建和填充視圖,提高列表的滑動性能。val item = getItem(position)//根據當前位置來獲取適配器中對應位置的數據項,并將其顯示在視圖中。這時就可以使用 getItem() 方法來獲取數據項。if (convertView == null) {view = LayoutInflater.from(context).inflate(resourceId, parent, false)//from(context) 方法返回一個 LayoutInflater 對象// convertView是一個作為緩存的view,通過使用這個緩存可以替換掉用Inflater加載組件這一步val tv: TextView = view.findViewById(R.id.tv)val iv: ImageView = view.findViewById(R.id.iv)viewHolder = ViewHolder(iv, tv)// 創建對象view.tag = viewHolder// 將 ViewHolder 對象保存在當前列表項的視圖對象 view 的 tag 屬性中。// tag 屬性是一個 Object 類型的對象,可以用于保存任意類型的數據。// 在這里,我們將 ViewHolder 對象保存在 tag 屬性中,以便在下次滑動列表時能夠重用其中的子視圖對象。} else {view = convertViewviewHolder = view.tag as ViewHolder//從當前視圖對象 view 的 tag 屬性中獲取之前保存的 ViewHolder 對象,// 并將其賦值給當前的 viewHolder 變量。在之前創建視圖對象時,// 我們已經將 ViewHolder 對象保存在視圖對象的 tag 屬性中,因此在重用視圖對象時,// 可以通過 tag 屬性來獲取之前保存的 ViewHolder 對象,并重用其中的子視圖對象,}if (item != null) {viewHolder.fruitImage.setImageResource(item.imageId)viewHolder.fruitName.text = item.name// 這樣就避免了重復調用 findViewById() 函數,// 提高了列表的滑動性能。因此,可以從這里體現到了不用重復調用 findViewById() 函數。}return view}
}class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_main)val list = ArrayList<Item>()for(i in 1..10){list.add(Item("1",R.drawable.ic_launcher_background))list.add(Item("2",R.drawable.ic_launcher_foreground))}val adp = myAdapter(this,R.layout.myitem,list)val lv:ListView = findViewById(R.id.lv)lv.adapter = adplv.setOnItemClickListener{parent, view, position, id ->//parent、view、position 和 id,分別表示列表控件、當前點擊的列表項視圖、// 當前點擊的列表項位置和當前點擊的列表項 ID(如果有設置)。val item = list[position]Toast.makeText(this, item.name, Toast.LENGTH_SHORT).show()}}
}

用viewHolder可以緩存控件,可以減少findViewById函數的調用次數。

在?ListView?或?RecyclerView?等列表控件中,當滑動列表時,會重用之前創建的視圖對象,以避免重復創建和填充視圖,提高列表的滑動性能。因此,我們需要使用?ViewHolder?對象來保存當前列表項中的子視圖對象,以便在下次滑動列表時能夠重用其中的子視圖對象。

ViewHolder?對象的作用是在列表控件中重用子視圖對象,以提高列表的滑動性能。在?ViewHolder?中,我們可以將子視圖對象作為成員變量保存起來,這樣在下次滑動列表時,就可以直接從?ViewHolder?中獲取子視圖對象,而不需要再次調用?findViewById()?函數來查找子視圖對象。

由于?findViewById()?函數的調用是比較耗時的操作,因此使用?ViewHolder?對象可以大大減少?findViewById()?函數的調用次數,從而提高列表的滑動性能。此外,使用?ViewHolder?對象還可以使代碼更加簡潔和易于維護。

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

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

相關文章

服務器租用中包含哪些?

服務器在目前的互聯網社會中起著十分重要的作用&#xff0c;服務器是網絡業務部署的重要載體&#xff0c;越來越多的企業和用戶選擇租用服務器業務來減少整體的成本&#xff0c;那么服務器租用中主要都包含哪些呢&#xff1f;接下來小編就來介紹一些其中的內容吧&#xff01; 首…

nginx 發布靜態資源

一. nginx 發布靜態資源 在nginx中nginx.conf配置文件中添加內容如下&#xff1a; server {listen 90;server_name localhost;# 配置靜態資源文件&#xff0c;就可以訪問了location / {root /home/fooie-shop;index index.html;}# 配置音頻和圖片資源location /imoo…

企業內部文化社區究竟有哪些好處?

首先&#xff0c;我們來了解下&#xff0c;企業內耗是什么? 在企業文化管理中&#xff0c;內耗是一個常見的問題&#xff0c;它會影響企業的團隊協作、執行效率和績效表現。在2023《哈佛商業評論》中國年會上&#xff0c;北大匯豐商學院管理實踐教授陳瑋分享了他對組織管理的…

馮喜運:5.14今日黃金原油漲跌走勢分析操作建議

【黃金消息面分析】&#xff1a;本周黃金市場將迎來關鍵的美國通脹數據&#xff0c;包括周二的生產者價格指數(PPI)和周三的消費者物價指數(CPI)。這些數據對美聯儲的政策路徑至關重要&#xff0c;可能會影響市場對利率調整的預期。目前&#xff0c;現貨黃金價格小幅上漲&#…

使用java.io庫序列化Java對象

在我們使用諸如Redis這類緩存系統時&#xff0c;我們往往會存在如下需求&#xff1a;將Java對象保存到Redis緩存中&#xff0c;然后在其他機器上還原回來。 Json方案 我們可以引入Json庫等方式&#xff0c;將Java對象序列化為Json字符串來實現這個目的&#xff0c;但是這樣的…

《四》系統模塊整體功能關聯與實現

在上一篇里&#xff0c;我們完成了動作的創建&#xff0c;那么這一次&#xff0c;我們把它加載到界面上&#xff0c;把需要是實現的動作都加上。 MyWord::MyWord(QWidget *parent): QMainWindow(parent) {mdiAreanew QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::S…

【Cesium解讀】Cesium中primitive/entity貼地

官方案例 Cesium Sandcastle Cesium Sandcastle 好文推薦&#xff1a;Cesium貼地設置_primitive貼地-CSDN博客 scene.globe.depthTestAgainstTerrain true; True if primitives such as billboards, polylines, labels, etc. should be depth-tested against the terrain…

釋放系統C盤的ext4.vhdx

ext4.vhdx 是個虛擬磁盤&#xff0c;默認位置為 C:\Users{用戶名}\AppData\Local\Docker\wsl\data\ext4.vhdx&#xff0c;會占用很大磁盤空間&#xff0c;可采用下列辦法將其改到其它磁盤或分區&#xff0c;如D分區。 1、查看有哪些&#xff1a; # wsl -l -vNAME …

靜態代碼掃描問題修復之--(輸入驗證 重定向[NodeJS])

問題描述: 當應用程序直接使用未經驗證的用戶輸入來控制重定向URL時,存在安全隱患。攻擊者可借此機會操縱輸入,引導用戶訪問惡意網站,實施網絡釣魚等攻擊。這在JavaScript前端代碼及Node.js后端邏輯中均需警惕。 案例分析: 應用程序允許未驗證的用戶輸入控制重定向中的UR…

MYSQL主從災難恢復

方案背景 MySQL一主一從,當主庫操作系統宕機無法啟動,vip已漂移到從庫,原從庫成為主庫單實例支撐業務。在新建主機上新建MySQL實例,配置為當前vip所在實例的從庫,恢復MySQL一主一從。 2 恢復步驟 2.1 新建MySQL實例 2.1.1 解壓安裝包 #將二進制包上傳至/usr/local/然后解…

Android Q - 音頻通路調試

對于當前模塊不是很清楚&#xff0c;剛好有個項目這方面有點問題&#xff0c;根據展銳支持文檔一步步檢查就可以了。首先得先弄清楚硬件具體是怎么連接的&#xff0c;比如文檔提到的案例&#xff1a;sprd codec speaker output 連接外部 PA。 耳機接的是什么&#xff0c;speake…

C/C++關鍵字:extern

文章目錄 一、extern&#xff1a;聲明外部變量或外部函數1.extern的作用2.代碼舉例①例1②例2③例3 一、extern&#xff1a;聲明外部變量或外部函數 1.extern的作用 extern的作用&#xff1a;聲明外部的全局變量或外部的函數&#xff0c;以實現跨文件使用其他.c/.h文件的全局…

【Vue】vue項目中使用高德地圖教程

在Vue項目中顯示高德地圖&#xff0c;你需要按照以下步驟進行 1. 注冊高德開發者賬號并獲取API密鑰2. 在Vue項目中引入高德地圖API3. 在Vue組件中創建地圖容器4. 在Vue組件中初始化地圖5. 添加其他地圖組件&#xff08;可選&#xff09;6. 處理地圖事件&#xff08;可選&#x…

[鏈表專題]力扣82

1. 力扣82 : 刪除排序鏈表中的重復元素 題 : 給定一個已排序的鏈表的頭 head &#xff0c; 刪除原始鏈表中所有重復數字的節點&#xff0c;只留下不同的數字 。返回 已排序的鏈表 。示例 1&#xff1a;輸入&#xff1a;head [1,2,3,3,4,4,5] 輸出&#xff1a;[1,2,5] 示例 …

【YOLO改進】換遍MMDET主干網絡之Pyramid Vision Transformer(PVT)(基于MMYOLO)

Pyramid Vision Transformer&#xff08;PVT&#xff09; Pyramid Vision Transformer&#xff08;PVT&#xff09;是一種深度學習模型&#xff0c;它結合了Transformer架構和金字塔結構&#xff0c;旨在將Transformer的強大能力引入計算機視覺任務中&#xff0c;特別是那些需…

如何深入理解業務需求和業務流程?

要深入理解業務需求和業務流程&#xff0c;可以嘗試以下方法&#xff1a; 1. 積極參與需求討論&#xff1a;在相關會議中認真聆聽&#xff0c;提出問題&#xff0c;與業務人員充分交流。 2. 研讀業務文檔&#xff1a;仔細分析業務規劃、產品說明等文檔&#xff0c;梳理出關鍵…

SQL練習題2.1

建表 # 學生表 create table t_student (stu_id varchar(10),stu_name varchar(10),stu_age datetime,stu_sex varchar(10) );# 課程表 create table t_t_course (c_id varchar(10),c_name varchar(10),c_teaid varchar(10) );# 教師表 create table t_t_teacher (tea…

C語言中數組與指針的區別

一. 簡介 本文學習了 C語言中數組與指針的區別。這樣的話&#xff0c;可以在編寫C代碼時規避掉出錯的問題。 二. C語言中數組與指針的區別 1. 數組 定義字符串數組時&#xff0c;必須讓編譯器知道需要多少空間。 一種方法是用足夠空間的數組存儲字符串。例如如下&#xf…

DOM重點核心(注冊事件+DOM事件流)

目錄 1.注冊事件 注冊時間概述 addEventListener() 刪除事件 2.DOM事件流 DOM事件流理論 事件對象 事件對象的常見屬性和方法 e.targe 和 this的區別 阻止默認行為 阻止冒泡 事件委托 禁止右鍵菜單和禁止選中文字 獲得鼠標的坐標&#xff08;可視區、頁面、瀏覽器…

js原生彈框多選框

js原生彈框多選框 代碼如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>JavaS…