一直都看別人用ViewHolder,自己也用過,卻不知道它的作用是什么?但知道肯定很有用,而且現在android studio應該有直接生產Viewholder的插件,
不過博主我是個新手,就沒嘗試去用什么插件,還是自己手動能多學點知識。
下面就講解一下ViewHolder的作用和用法
ViewHolder通常出現在適配器里,為的是listview滾動的時候快速設置值,而不必每次都重新創建很多對象,從而提升性能。
在android開發中Listview是一個很重要的組件,它以列表的形式根據數據的長自適應展示具體內容,用戶可以自由的定義listview每一列的布局,但當listview有大量的數據需要加載的時候,會占據大量內存,影響性能,這時候就需要按需填充並重新使用view來減少對象的創建。
ListView加載數據都是在public View getView(int position, View convertView, ViewGroup parent) {}方法中進行的
(要自定義listview都需要重寫listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),
優化listview的加載速度就要讓convertView匹配列表類型,並最大程度上的重新使用convertView。
getview的加載方法一般有以下三種種方式:
1.每一次都重新定義一個View載入布局,再加載數據(最慢的加載方式)
public View getView(int position, View convertView, ViewGroup parent)
{
View view = LayoutInflater.from(context).inflate(R.layout.main_item,null);
ImageView imageView = (ImageView)convertView.findViewById(R.id.item_img);
TextView textView = (TextView)convertView.findViewById(R.id.item_txt);
imageView.setBackgroundResource(imgs[position]);
textView.setText(strs[position]);
return view;
}
2.當convertView不為空的時候直接重新使用convertView從而減少了很多不必要的View的創建,然后加載數據(正常的加載方式)
public View getView(int position, View convertView, ViewGroup parent)
{
if(convertView = null){
convertView = LayoutInflater.from(context).inflate(R.layout.main_item,null);
}
ImageView imageView = (ImageView)convertView.findViewById(R.id.item_img);
TextView textView = (TextView)convertView.findViewById(R.id.item_txt);
imageView.setBackgroundResource(imgs[position]);
textView.setText(strs[position]);
return convertView;
}
3.定義一個ViewHolder,將convetView的tag設置為ViewHolder,不為空時重新使用即可(最快的加載方式)
class ViewHolder{ ImageView imageView; TextView textView; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.main_item,parent,false); holder = new ViewHolder(); holder.imageView = (ImageView)convertView.findViewById(R.id.item_img); holder.textView = (TextView)convertView.findViewById(R.id.item_txt); convertView.setTag(holder); }else { holder = (ViewHolder)convertView.getTag(); } holder.imageView.setBackgroundResource(imgs[position]); holder.textView.setText(strs[position]); return convertView; }