成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

值得收藏的ViewHolder工具類實(shí)現(xiàn)

移動(dòng)開發(fā) Android
作為最偉大的第二十二世紀(jì)的程序員們,脫掉、搞上永遠(yuǎn)是我們最真摯的追求,所以我們要怎么將ViewHolder從BaseAdapter中脫掉呢?絕非不是不用,而是要將其搞成一個(gè)華麗麗的工具類實(shí)現(xiàn),收入角落那個(gè)寂寞得tools類中。

前言

在開發(fā)APP的過程中,攻城獅少不了要跟ListView、GridView這些組件眉來眼去,暗送幾波秋波。自然原生態(tài)美人BaseAdapter更是程序員的最愛,有了它,我們想怎么干就能怎么干,嘿嘿,你懂的O(∩_∩)O哈哈~

但是,每次寫一個(gè)BaseAdapter,我們都很自覺的給他寫一個(gè)ViewHolder,一兩個(gè)還好,萬(wàn)一應(yīng)用程序中有數(shù)不清的ListView,呵呵~你妹!千篇一律,看得都審美疲勞。作為最偉大的第二十二世紀(jì)的程序員們,脫掉、搞上永遠(yuǎn)是我們最真摯的追求,所以我們要怎么將ViewHolder從BaseAdapter中脫掉呢?絕非不是不用,而是要將其搞成一個(gè)華麗麗的工具類實(shí)現(xiàn),收入角落那個(gè)寂寞得tools類中。

[[180596]]

ViewHolder的實(shí)現(xiàn)

我覺得應(yīng)該簡(jiǎn)略的介紹下ViewHolder的實(shí)現(xiàn),谷歌很聰明的在Adapter中運(yùn)用了復(fù)用View的思想,自然讓我們的屌絲機(jī)也能泡上一些白富美應(yīng)用多了一點(diǎn)點(diǎn)可能。ViewHolder的具體實(shí)現(xiàn)基本體現(xiàn)在BaseAdapter的 getView(int position, View convertView, ViewGroup parent) 這個(gè)方法里面,參見下面的代碼: 

  1. @Override 
  2.  
  3. public View getView(int position, View convertView, ViewGroup parent) { 
  4.  
  5.     ViewHolder holder; 
  6.  
  7.     if (convertView == null) { 
  8.  
  9.         convertView = inflater.inflate(R.layout.listview_item_layout, parent, false); 
  10.  
  11.         holder = new ViewHolder(); 
  12.  
  13.         holder.studentName = (TextView) convertView.findViewById(R.id.student_name); 
  14.  
  15.         holder.studentAge = (TextView) convertView.findViewById(R.id.student_age); 
  16.  
  17.         convertView.setTag(holder); 
  18.  
  19.     } 
  20.  
  21.     else { 
  22.  
  23.         holder = (ViewHolder) convertView.getTag(); 
  24.  
  25.     } 
  26.  
  27.     Student data = (Student) getItem(position); 
  28.  
  29.     holder.studentName.setText(data.getName()); 
  30.  
  31.     holder.studentAge.setText(data.getAge()); 
  32.  
  33.     return convertView; 
  34.  
  35.  
  36.   
  37.  
  38. class ViewHolder { 
  39.  
  40.     public TextView studentName; 
  41.  
  42.     public TextView studentAge; 
  43.  
  44.  

很明顯,大家不要問我ViewHolder在哪里,稍微把目光往上扶一扶就看到那個(gè)大大的 class ViewHolder 。這里的ViewHolder用法主要有兩個(gè)地方,一是 convertView 的復(fù)用,二是 ViewHolder 也就是 convertView 里面的索引的復(fù)用。具體的用法不熟悉的話可以百度一下,再往下說就對(duì)不起我今天這篇博文了,因?yàn)樵谶@里寫這個(gè)代碼的目的,肯定不是介紹你怎么用ViewHolder,只是想告訴你:傳統(tǒng)的ViewHolder的寫法,是多么的臃腫!而且對(duì)于每一個(gè)新的BaseAdapter,你都得無(wú)聊的實(shí)現(xiàn)一次又一次,OH~

ViewHolder的工具類實(shí)現(xiàn)

自然,脫光要從小,行動(dòng)要趁早。既然我們煩了,就把它寫成一個(gè)工具類咯。參見下面的代碼

  1. static class ViewHolder { 
  2.  
  3.     public static <T extends View> T get(View viewint id) { 
  4.  
  5.         SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); 
  6.  
  7.         if (viewHolder == null) { 
  8.  
  9.             viewHolder = new SparseArray<View>(); 
  10.  
  11.             view.setTag(viewHolder); 
  12.  
  13.         } 
  14.  
  15.         View childView = viewHolder.get(id); 
  16.  
  17.         if (childView == null) { 
  18.  
  19.             childView = view.findViewById(id); 
  20.  
  21.             viewHolder.put(id, childView); 
  22.  
  23.         } 
  24.  
  25.         return (T) childView; 
  26.  
  27.     } 
  28.  
  29.  

這是工具類的實(shí)現(xiàn),稍微說下實(shí)現(xiàn)的原理:

1、ViewHolder既然是依賴View的Tag存放,但是以一個(gè) SparseArray 集合存放。

2、判斷View里的Tag是否存在viewHolder,不存在,趕緊叫她生一個(gè)。

3、然后在viewholder(也就是SparseArray)尋找View的索引,如果沒有,趕緊findViewById一個(gè)put進(jìn)去順便return出來,如果已經(jīng)存在,皆大歡喜,直接用唄。

貼個(gè)BaseAdapter里面使用的代碼: 

  1. @Override 
  2.  
  3. public View getView(int position, View convertView, ViewGroup parent) { 
  4.  
  5.     if (convertView == null) { 
  6.  
  7.         convertView = inflater.inflate(R.layout.listview_item_layout, parent, false); 
  8.  
  9.     } 
  10.  
  11.     TextView name = Tools.ViewHolder.get(convertView, R.id.student_name); 
  12.  
  13.     TextView age = Tools.ViewHolder.get(convertView, R.id.student_age); 
  14.  
  15.      
  16.  
  17.     Student data = (Student) getItem(position); 
  18.  
  19.     name.setText(data.getName()); 
  20.  
  21.     age.setText(data.getAge()); 
  22.  
  23.      
  24.  
  25.     return convertView; 
  26.   

簡(jiǎn)潔明了,不用多說~~~嘿嘿,后面如果要寫ViewHolder,直接Tools工具類調(diào)用,省心不廢腦。。

分析可行性

既然要作為工具類使用,我們有必要先評(píng)估這個(gè)工具值不值得我們使用。

一般來說,我們可以從以下幾個(gè)方面進(jìn)行評(píng)估:易用性? 內(nèi)存泄露? 性能提升? 健壯性?等等等。。。。。。

易用性:工具類的最大特性就是易用簡(jiǎn)約,這個(gè)ViewHolder的寫法就是典型的拿來就用的主義,根本不用我們操心寫些適配的代碼,直接傳入View和id,高內(nèi)聚松耦合。并且采用了<T extends View> T的泛型模板的方法,自動(dòng)與外部的View子類適配,不用我們手動(dòng)去強(qiáng)制裝換。

內(nèi)存泄露:有些初學(xué)者,看到static方法就回固執(zhí)的認(rèn)為 SparseArray<View> viewHolder 這個(gè)變量會(huì)存在內(nèi)存泄露,但是java告訴我們,這個(gè)變量的小命僅僅在方法執(zhí)行之中,方法完畢,GC回收;存在ViewHolder一如既往放在View的Tag中,一旦View被回收,ViewHolder自然消失。不信,打開DDMS,用你28青年的手速不停刷listView試試,保證對(duì)象基本穩(wěn)定在一個(gè)值。

性能提升:在這里我們發(fā)現(xiàn)用了 SparseArray 這個(gè)集合而不是 HashMap ,我們知道 SparseArray 是Android的一個(gè)工具類,是官方推薦用來代替 HashMap<Integer,E> 的一個(gè)類,它的內(nèi)部采用了二分查找的實(shí)現(xiàn)提高了查找效率,而且不是一點(diǎn)兩點(diǎn)的哦,誰(shuí)用誰(shuí)知道;具體內(nèi)容想要了解,可以度娘谷哥或者左轉(zhuǎn)源碼。

所以,作為一個(gè)工具類,它是完全合格的,趕緊把它拷貝到你的tools、util里面,然后我們就可以開心加愉悅的優(yōu)雅用起ViewHolder了。。 

責(zé)任編輯:龐桂玉 來源: 安卓開發(fā)精選
相關(guān)推薦

2015-05-06 10:06:48

AndroidViewHolder

2015-12-02 11:05:48

2020-11-27 15:00:22

Kubernetes程序工具

2020-10-10 11:14:15

工具軟件Linux

2020-06-24 16:20:02

LinuxCPU監(jiān)控工具

2020-05-28 15:14:05

LinuxCPU監(jiān)控工具

2024-07-31 08:33:17

2019-04-22 15:00:05

CSS前端開發(fā)

2020-01-29 19:34:57

工具黑客語(yǔ)音合成

2017-03-23 10:21:57

CSS3動(dòng)效庫(kù)前端

2023-07-26 00:40:25

AI工具備忘錄

2019-04-03 05:09:59

網(wǎng)絡(luò)掃描無(wú)線網(wǎng)絡(luò)監(jiān)控

2019-10-12 00:03:07

MyCat數(shù)據(jù)庫(kù)分庫(kù)分表

2013-07-22 10:01:03

JavascriptWeb

2019-04-01 05:02:48

搜索架構(gòu)檢索

2022-01-05 07:07:36

網(wǎng)絡(luò)

2015-06-09 14:23:43

CSS收藏CSS框架

2022-06-28 10:20:58

微服務(wù)架構(gòu)RPC

2020-12-25 17:19:27

工具網(wǎng)絡(luò)網(wǎng)站

2018-04-26 10:48:36

機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)TensorFlow
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人免费网站视频 | 91精品国产乱码久久蜜臀 | 一区二区三区日韩精品 | 色婷婷综合久久久久中文一区二区 | 国产aⅴ| 一级a爱片性色毛片免费 | 国产精品久久久久不卡 | 亚洲精品视频一区二区三区 | 7777奇米影视| av免费入口 | caoporn免费在线视频 | 欧美精品在线播放 | 精精国产xxxx视频在线播放 | 天天干天天干 | 欧美激情国产日韩精品一区18 | 一区二区三区日韩精品 | 伊久在线 | 精品国产伦一区二区三区观看体验 | 国产三级国产精品 | 欧美日韩国产一区二区 | 成人亚洲精品 | 日本黄色一级片视频 | 99久久久无码国产精品 | 久久久久久免费免费 | 久久国产欧美日韩精品 | 午夜影院视频在线观看 | 综合国产 | 色网站入口 | 国产精品一区二区久久 | 91免费入口 | 日日操夜夜操天天操 | 黄网站在线播放 | 亚洲视频国产 | 日韩高清三区 | 欧美日韩高清在线观看 | 欧洲视频一区二区 | 国产精品日日摸夜夜添夜夜av | 国产一区二区三区 | 久在线精品视频 | 亚洲天堂一区二区 | 7777奇米影视|