成人免费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

設計模式場景

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編程語言

2013-03-27 09:17:17

Android開發AndroidList

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#適配器設計模式

2021-08-16 17:15:19

設計模式Android適配器模式

2024-02-22 12:13:49

適配器模式代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91av视频在线播放 | 日韩欧美一区二区三区四区 | 男女那个视频 | 欧美日韩久久精品 | 亚洲福利一区二区 | 偷拍第一页 | 欧美一区二区在线播放 | 欧美 视频| 久久免费精品 | 成年人精品视频在线观看 | 91久久久精品国产一区二区蜜臀 | 91精品久久久 | 新av在线| 日日操网站 | 成人欧美一区二区三区黑人孕妇 | 亚洲精品 在线播放 | 日韩色视频 | 欧美区在线 | 免费大黄视频 | 亚洲成人一二区 | 日韩成人中文字幕 | 国产成人一区二 | 久久99精品久久 | 一级免费看| 国产一区中文字幕 | 香蕉久久av| 成人h电影在线观看 | 免费福利视频一区二区三区 | 日日欧美 | 国产不卡在线播放 | 久久国产一区二区 | 亚洲精品大全 | 97人人澡人人爽91综合色 | 久久国产精品一区 | 欧产日产国产精品99 | 免费激情 | julia中文字幕久久一区二区 | 亚洲国产精品人人爽夜夜爽 | 久久久久久网站 | 免费视频一区 | 麻豆av网站 |