viewholde另一种写法

来源:互联网 发布:程序员用什么浏览器 编辑:程序博客网 时间:2024/06/07 12:41
每为一个AdapterView写Adapter适配器,你是否都会创建 一个static的ViewHolder类来负责临时存储ItemView?不用回答我也已经听见了你的抱怨,那么下面为大家介绍另外一种我经常使用的写法,从此和无尽的ViewHolder说拜拜,而且不会影响页面加载的性能。

Android为开发者提供了ListView和GridView这两个常用于显示列表的控件。在不使用ViewHolder的情况下过程中,列表子View数量不多的情况下,可能不大看的出列表加载性能上的差异。但是相信在菜鸟阶段的时候,每一位都亲测过在上述情况下,列表展示较多数据时加载是何等的坑爹,会出现滑动不畅呀的现象。出现的原因呢就是因为加载了过多的子View,每一个子View都需要查找id呀,界面重绘呀等操作,这样导致了内存开销过大以及手机绘图的效率跟不上,才会出现前面我们说的滑动较卡的现象。所以Android为我们开发者提供了标准的ViewHolder的写法来重用列表的ItemView,来避免出现上述两个问题。最标准的写法,就是为每一个AdapterView的子View新建一个对应的ViewHolder,同时声明为prtivate final static。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private final static class ViewHolder {  
  2.     LoadingImageView img;  
  3.     TextView name;  
  4.     TextView price;  
  5.     TextView origin_price;  
  6.     TextView sales_volume;  
  7. }  


好了,背景介绍完毕,上代码。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class ViewHolder {  
  2.     @SuppressWarnings("unchecked")  
  3.     public static <T extends View> T get(View view,int id){  
  4.         SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();  
  5.         if(viewHolder == null){  
  6.             viewHolder = new SparseArray<View>();  
  7.             view.setTag(viewHolder);  
  8.         }  
  9.         View childView = viewHolder.get(id);  
  10.         if(childView == null){  
  11.             childView = view.findViewById(id);  
  12.             viewHolder.put(id, childView);  
  13.         }  
  14.         return (T) childView;  
  15.     }  
  16. }  


[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public View getView(int position,View converView,ViewGroup parent){  
  2.         if(converView == null){  
  3.             converView = mInflater.inflate(R.layout.edit_item, parent,false);  
  4.         }  
  5.         ImageView img = ViewHolder.get(converView, R.id.imageview);  
  6.         return converView;  
  7.     }  


上面两张图片展示了ViewHolder和它的使用。可以看到这里定义的ViewHolder代码是十分的简单,使用起来也是非常的轻便。而且这种代码的写法也完全等价于谷歌官方推荐我们使用的做法。看到这里是不是很惬意呀!

SparseArray<View>在代码理解上等价于HashMap<Interger, View>,SparseArray是Android提供的一个数据结构,旨在提高查询的效率。所以View childView = viewHolder.get(id);这句代码的时间上的开销是极小的,完全不会影响到执行的效率。

今天的代码很少,就不为大家提供源码了,也就上面区区十来行。最后希望可以帮到各位在码农一线工作的朋友。

0 0
原创粉丝点击