中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android數據適配器ViewHolder怎么用

發布時間:2022-03-29 17:21:56 來源:億速云 閱讀:220 作者:iii 欄目:移動開發

這篇文章主要介紹了Android數據適配器ViewHolder怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Android數據適配器ViewHolder怎么用文章都會有所收獲,下面我們一起來看看吧。

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

Android數據適配器ViewHolder怎么用

初學者簡單但低效的方式

public View getView(int position, View convertView, ViewGroup parent) {     View item= inflater.inflate(R.layout.good_list_item, null, false);           ImageView img = (ImageView) item.findViewById(R.id.img);   TextView price = (TextView) item.findViewById(R.id.price);   img.setImageResource(R.drawable.ic_launcher);   price.setText("$"+list.get(position).price);              return item;  }

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

利用convertView

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

public View getView(int position, View convertView, ViewGroup parent) {        if(convertView==null){           convertView = inflater.inflate(R.layout.good_list_item, null, false);       }       TextView tv_price = (TextView)convertView.findViewById(R.id.price)       ImageView iv = (ImageView)convertView.findViewByID(R.id.img);              return convertView;   }

使用ViewHolder

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

class ViewHolder{       ImageView img;       TextView price;  } public View getView(int position, View convertView, ViewGroup parent) {       ViewHolder holder = new ViewHolder();       if(convertView==null){          convertView = inflater.inflate(R.layout.good_list_item, null, false);          holder.img = (ImageView) convertView.findViewById(R.id.img);           holder.price = (TextView) convertView.findViewById(R.id.price);           convertView.setTag(holder);         }else{           holder = (ViewHolder) convertView.getTag();       }       //設置holder       holder.img.setImageResource(R.drawable.ic_launcher);      holder.price.setText("$"+list.get(position).price);                  return convertView;   }

優雅的使用ViewHolder

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

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

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

public class ViewHolder{         private final SparseArray<View> views;      private View convertView;         private ViewHolder(View convertView){          this.views = new SparseArray<View>();          this.convertView = convertView;          convertView.setTag(this);      }        public static ViewHolder get(View convertView){          if (convertView == null) {              return new ViewHolder(convertView);          }          ViewHolder existedHolder = (ViewHolder) convertView.getTag();          return existedHolder;     }        public <T extends View> T getView(int viewId) {          View view = views.get(viewId);          if (view == null) {              view = convertView.findViewById(viewId);              views.put(viewId, view);          }          return (T) view;      }  }

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

public View getView(int position, View convertView, ViewGroup parent) {          if (convertView == null) {              convertView = LayoutInflater.from(context)                      .inflate(R.layout.good_list_item, null, false);          }             ViewHolder mViewHolder = ViewHolder.get(convertView);         TextView price = mViewHolder.getView(R.id.price);         //...其他getView             return convertView;      }

關于“Android數據適配器ViewHolder怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Android數據適配器ViewHolder怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金堂县| 威宁| 桂阳县| 隆德县| 林芝县| 雷州市| 万全县| 阳江市| 洪湖市| 大庆市| 武定县| 通许县| 易门县| 东至县| 乃东县| 辽阳县| 宁阳县| 中方县| 蕉岭县| 九龙县| 布拖县| 彝良县| 肇庆市| 建阳市| 泽州县| 科尔| 噶尔县| 灌阳县| 凤翔县| 多伦县| 玉屏| 筠连县| 茌平县| 秀山| 监利县| 响水县| 海淀区| 施甸县| 柳林县| 郁南县| 玉龙|