日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
Android數據適配器(Adapter)優(yōu)化:高效ViewHolder

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

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網站建設服務10余年為成都成都陽光房小微創(chuàng)業(yè)公司專業(yè)提供成都企業(yè)網站定制營銷網站建設商城網站建設手機網站建設小程序網站建設網站改版,從內容策劃、視覺設計、底層架構、網頁布局、功能開發(fā)迭代于一體的高端網站建設服務。

初學者簡單但低效的方式

 
 
 
 
  1. public View getView(int position, View convertView, ViewGroup parent) { 
  2.   
  3.   View item= inflater.inflate(R.layout.good_list_item, null, false); 
  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的每次創(chuàng)建是比較耗時的,因此對于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, null, false); 
  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, null, false); 
  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.   } 

優(yōu)雅的使用ViewHolder

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

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

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

 
 
 
 
  1. public class ViewHolder{ 
  2.    
  3.      private final SparseArray views; 
  4.      private View convertView; 
  5.   
  6.       private ViewHolder(View convertView){ 
  7.          this.views = new SparseArray(); 
  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 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, null, false); 
  5.          } 
  6.    
  7.          ViewHolder mViewHolder = ViewHolder.get(convertView); 
  8.         TextView price = mViewHolder.getView(R.id.price); 
  9.         //...其他getView 
  10.    
  11.          return convertView; 
  12.      } 

分享標題:Android數據適配器(Adapter)優(yōu)化:高效ViewHolder
本文路徑:http://www.5511xx.com/article/cdopiig.html