Listview 对ViewHolder的复用

以前使用Listview  实现convertView的复用,  都是在Adapter中写一个静态类:

 

其实有时候感觉很不方便

这几天看一个开源项目, 发现使用有个大神写了一个ViewHolder.java的东西,让人耳目一新, 其实是通过一个SparseArray来缓存这些view, 省去了自己

写一堆view将来 改造也麻烦的问题 效率虽然差了一点点, 但是开发效率提高了不少

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class ViewHolder  
  2. {  
  3.     final View mRoot;  
  4.     //缓存item中各个view , 省去下次findviewbyid   
  5.     final SparseArray<View> mViews = new SparseArray<View>();  
  6.       
  7.     public ViewHolder(View root)  
  8.     {  
  9.         this.mRoot = root;  
  10.     }  
  11.       
  12.     @SuppressWarnings ("unchecked")  
  13.     public <T extends View> T getViewById(int id)  
  14.     {  
  15.         T view = (T) mViews.get(id);  
  16.         if (view == null)  
  17.         {  
  18.             mViews.put(id, (view = (T) mRoot.findViewById(id)));  
  19.             if (view == null)  
  20.                 throw new NullPointerException("Cannot find requested view id "+String.valueOf(id));  
  21.         }  
  22.         return view;  
  23.     }  
  24.       
  25.     public boolean hasView(int id)  
  26.     {  
  27.         if (mViews.get(id) != nullreturn true;  
  28.         else  
  29.         {  
  30.             View view = this.mRoot.findViewById(id);  
  31.             if (view == nullreturn false;  
  32.             else  
  33.             {  
  34.                 mViews.put(id, view);  
  35.                 return true;  
  36.             }  
  37.         }  
  38.     }  
  39. }  

测试代码:


[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity  
  2. {  
  3.   
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         ListView listView = new ListView(this);  
  8.         listView.setAdapter(new MyAdapter());  
  9.         setContentView(listView);  
  10.           
  11.     }  
  12.       
  13.     private class MyAdapter extends BaseAdapter  
  14.     {  
  15.           
  16.         @Override  
  17.         public int getCount() {  
  18.             return 1000;  
  19.         }  
  20.           
  21.         @Override  
  22.         public Object getItem(int position) {  
  23.             return null;  
  24.         }  
  25.   
  26.         @Override  
  27.         public long getItemId(int position) {  
  28.             return 0;  
  29.         }  
  30.           
  31.         @Override  
  32.         public View getView(int position, View convertView, ViewGroup parent) {  
  33.             if (convertView == null) {  
  34.                 convertView = buildView(R.layout.layout_item, parent);  
  35.             }  
  36.             ViewHolder viewHolder = (ViewHolder) convertView.getTag();  
  37.             TextView textView = viewHolder.getViewById(R.id.textView1);  
  38.             textView.setText("Test" + position);  
  39.             return convertView;  
  40.         }  
  41.           
  42.         //把组装xml view的 函数抽取出来  
  43.         protected View buildView(int redId, ViewGroup parent) {  
  44.             View view = LayoutInflater.from(MainActivity.this).inflate(redId, parent, false);  
  45.             view.setTag(new ViewHolder(view));  
  46.             return view;  
  47.         }  
  48.     }  
  49.       
  50. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值