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

Android數據適配器(Adapter)優化:高效ViewHolder

移動開發 Android
在使用Listview或GridView的時候,往往需要自定義數據適配器,一般都要覆寫getView(),在該方法中有一個convertView參數,該參數就是用來加載數據時的View。

在使用Listview或GridView的時候,往往需要自定義數據適配器,一般都要覆寫getView(),在該方法中有一個convertView參數,該參數就是用來加載數據時的View。

初學者簡單但低效的方式

  1. public View getView(int position, View convertView, ViewGroup parent) { 
  2.   
  3.   View item= inflater.inflate(R.layout.good_list_item, nullfalse); 
  4.         
  5.   ImageView img = (ImageView) item.findViewById(R.id.img); 
  6.   TextView price = (TextView) item.findViewById(R.id.price); 
  7.   img.setImageResource(R.drawable.ic_launcher); 
  8.   price.setText("$"+list.get(position).price); 
  9.            
  10.   return item; 
  11.  } 

每次加載view,都要重新建立很多view對象,如果某條listview中有一萬條數據,這種加載方式就歇菜了。

利用convertView

利用Android的Recycler機制,利用convertView來重新回收View,效率有了本質提高。View的每次創建是比較耗時的,因此對于getview方法傳入的convertView應充分利用 != null的判斷 。

  1. public View getView(int position, View convertView, ViewGroup parent) { 
  2.  
  3.       if(convertView==null){ 
  4.           convertView = inflater.inflate(R.layout.good_list_item, nullfalse); 
  5.       } 
  6.       TextView tv_price = (TextView)convertView.findViewById(R.id.price) 
  7.       ImageView iv = (ImageView)convertView.findViewByID(R.id.img); 
  8.        
  9.       return convertView; 
  10.   } 

使用ViewHolder

ViewHolder將需要緩存的view封裝好,convertView的setTag才是將這些緩存起來供下次調用。 當你的listview里布局多樣化的時候 viewholder的作用體現明顯,效率再一次提高。 View的findViewById()方法也是比較耗時的,因此需要考慮只調用一次,之后就用View.getTag()方法來獲得ViewHolder對象。

  1. class ViewHolder{ 
  2.       ImageView img; 
  3.       TextView price; 
  4.  } 
  5. public View getView(int position, View convertView, ViewGroup parent) { 
  6.       ViewHolder holder = new ViewHolder(); 
  7.       if(convertView==null){ 
  8.          convertView = inflater.inflate(R.layout.good_list_item, nullfalse); 
  9.          holder.img = (ImageView) convertView.findViewById(R.id.img); 
  10.           holder.price = (TextView) convertView.findViewById(R.id.price); 
  11.           convertView.setTag(holder);   
  12.       }else
  13.           holder = (ViewHolder) convertView.getTag(); 
  14.       } 
  15.       //設置holder 
  16.       holder.img.setImageResource(R.drawable.ic_launcher); 
  17.      holder.price.setText("$"+list.get(position).price); 
  18.            
  19.       return convertView; 
  20.   } 

優雅的使用ViewHolder

使用ViewHolder時,每次一遍一遍的findViewById,一遍一遍在ViewHolder里面添加View的定義,view一多,是不是感覺煩爆了,base-adapter-helper這個類庫似乎***的解決了這個問題。

其設計思想是使用 SparseArray來存儲view的引用,代替了原本的ViewHolder,不用聲明一大堆View,簡潔明了。

我也自己動手寫了一個簡單版的ViewHolder。

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

使用的話就超級簡單和簡潔了:

  1. public View getView(int position, View convertView, ViewGroup parent) { 
  2.          if (convertView == null) { 
  3.              convertView = LayoutInflater.from(context) 
  4.                      .inflate(R.layout.good_list_item, nullfalse); 
  5.          } 
  6.    
  7.          ViewHolder mViewHolder = ViewHolder.get(convertView); 
  8.         TextView price = mViewHolder.getView(R.id.price); 
  9.         //...其他getView 
  10.    
  11.          return convertView; 
  12.      } 

 

責任編輯:閆佳明 來源: stackvoid
相關推薦

2012-08-02 10:46:34

JavaAdapter模式

2024-07-31 10:41:16

C#設計模式

2013-11-26 16:39:21

Android設計模式

2012-09-19 15:29:26

Worklight適配器

2020-10-25 08:56:21

適配器模式

2022-02-18 17:21:29

適配器模式客戶端

2015-08-07 10:05:37

recyclervie超省寫法

2021-02-18 08:39:28

設計模式場景

2013-03-27 09:17:17

Android開發AndroidList

2009-11-18 18:08:20

PHP適配器模式

2009-12-21 10:26:09

Oracle適配器

2012-05-16 17:22:11

Java設計模式

2018-10-11 10:38:31

前端JavaScript編程語言

2022-02-13 23:33:24

設計模式Java

2021-08-06 06:51:16

適配器配置Spring

2021-02-16 08:16:09

適配器模式MybatisJava

2011-04-28 09:54:50

jQuery

2013-02-26 10:55:47

C#適配器設計模式

2024-02-22 12:13:49

適配器模式代碼

2009-11-11 17:12:25

ADO.NET批處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线国产视频观看 | 男女激情网站免费 | 久久久精彩视频 | 亚州激情 | 国产一区二区三区四区hd | 久久久av| 久久精品国产久精国产 | 国产丝袜人妖cd露出 | 欧美精品久久久 | 91久久精品国产 | 亚洲国产成人精品女人久久久野战 | 精品国产乱码久久久久久88av | 国产成人一区二区三区 | 国产精品久久久久久中文字 | 午夜精品一区二区三区在线观看 | 亚洲国产精品久久久久久 | 97国产爽爽爽久久久 | 久久免费国产 | 高清久久久 | 蜜桃久久 | 国产欧美一区二区三区免费 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 国产在线网站 | 午夜成人在线视频 | 中文字幕亚洲一区二区三区 | 中国黄色在线视频 | 精品视频一区二区三区 | 国产精品久久国产精品99 gif | 欧美日韩亚洲国产 | 天天爽天天干 | 三级成人在线 | 久久久久久久久久影视 | 欧美日韩久久 | 国产伦精品一区二区三区高清 | 91视频在线观看 | 天天综合久久 | 国产精品久久久久久吹潮 | 欧美日韩中文字幕在线 | 在线视频 欧美日韩 | 欧美精产国品一二三区 | 亚洲成人观看 |