Android——ViewHolder简洁写法

来源:互联网 发布:手机全局透明软件 编辑:程序博客网 时间:2024/06/02 05:29

一般我们在使用ListView时,需要给ListView指定一个自定义的Adapter,其中要使用到ViewHolder来优化ListView,一般的写法是这样的:

   //内部类   static class ViewHolder{       private TextView tv;       //等等一堆属性...       //提供访问和设置属性的方法       public TextView getTv(){          return tv;       };       public void setTv(TextView v){          tv=v;       }   } //然后在你getView的方法里面这样用 @Override public View getView(int positio,View convertView,ViewGroup parent){     if(convertView==null)[          convertView=View.inflate(getContext(),R.layout.item_list,null);          ViewHolder vh=new ViewHolder();          //给ViewHolder设置属性          vh.setTv(convertView.findViewById(R.id.tv));          convertView.setTag(vh);     }     //取出ViewHolder     ViewHolder vh=(ViewHolder)convertView.getTag();     //取出控件进行赋值     vh.getTv().setText("item"+position);     return convertView; } 

这样写一般是没什么问题的,那么当一个应用中有许多的Adapter要写的时候,需要各写一个ViewHolder。很麻烦是吧。介绍一种简洁的ViewHolder的写法(非原创):

//单独做一个通用的ViewHolder工具类public class ViewHolder{    //提供一个静态的方法    public static <T extends View> T get(View v,int id){        //采用一个SparseArray保存键值对(SparseArray是一个简单的<int,Object>键值对保存对象)       SparseArray arr=v.getTag();       if(arr==null){          arr=new SparseArray();          //以前tag里面我们存的是ViewHolder,现在我们存的是一个SparseArraya          v.setTag(arr);       }       //获得子控件       View childView=arr.get(id);       if(childView==null){           childView=v.findViewById(id);           //SparseArraya存的是<id,View>           arr.put(id,childView);        }       return childView;    }}

好了,使用的使用的时候简单多了

    @Override    public View getView(int position, View convertView, ViewGroup parent) {        if(convertView==null)            convertView=View.inflate(getContext(),R.layout.item_list,null);        TextView tvTitle=ViewHolder.get(convertView, R.id.tv_title);        TextView tvContent=ViewHolder.get(convertView, R.id.tv_content);        tvTitle.setText(getItem(position)+":->>>title");        tvContent.setText(getItem(position)+"->>>content");        return convertView;    }
0 0