ViewHolder的作用和用法


一直都看別人用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;
    }

 

參考:http://blog.csdn.net/jacman/article/details/7087995


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM