ViewHolder模式超简洁写法,很cool!
2014-06-27 11:05
447 查看
转自http://www.eoeandroid.com/forum.php?mod=viewthread&tid=321547&page=3#pid3555274
ViewHolder是什么就不解释了。
大家通常怎么写ViewHolder呢?
这么写一次还行,但问题是总有很多很多的ViewAdapter要这么写,每次都repeat,repeat,repeat 累啊。 所以,有这么一种简洁的写法分享给大家,先声明,从国外网站上看的,不是自己原创的,但确实很喜欢这个简洁的设计。
ViewHolder这么写(只提供一个静态方法,其实可以加一个私有构造函数防止外部实例化),代码很简单,看过就明白了
在getView里这样
哈哈,完成了,果断把这个ViewHolder类加入自己的utils,一劳永逸了以后~
值得注意的是SparseArray这个知识点,优化过的存储integer和object键值对的hashmap,网上资料很多这里就不废话了~
其实这种写法本质和ViewHolder Partten没有什么不同,ViewHolder Partten是把一个自定义类绑定到一个view,这种是把SparseArray绑定到一个view,虽然SparseArray 初始化会分配10长度的地址,理论上貌似浪费了内存,理论上插入和删除操作也是有时间损耗的,但是这些都在允许范围内。
比如https://github.com/JoanZapata/base-adapter-helper 作者也说了他做了大量测试,这种损耗微乎其微。
再次,万一万一因特殊情况发现了有性能瓶颈,到时候再优化就可以了,但是绝大多数场合都是可以使用的,大量简化你的开发,加快开发速度,代码少了,出错的几率就小了,维护的成本也小了~好处还是大大的。
简单的纸上分析~:
(1)ViewHolder Pattern是每一个View一个ViewHolder,里面是记录listitem内控件引用; SparseArray是记录id和控件引用的键值对,当然SparseArray初始化会分配一定地址空间(默认是10),但是这些内存损耗应该是可以忽略的~
(2)SparseArray是优化过的int-object的hashmap,使用折半查找,并优化了内存分配,所以代码执行成本通常是可控的。
综上,使用SparseArray与ViewHolder相比是有损耗,但应该是可控的。使用SparseArray优点是加快开发速度和减少代码维护,当发现有性能瓶颈时,再进行优化~
ViewHolder是什么就不解释了。
大家通常怎么写ViewHolder呢?
01 | ViewHolder holder = null ; |
02 | if (convertView == null ){ |
03 | convertView = mInflater.inflate(R.layout.xxx null ); |
04 | holder = new ViewHolder(); |
05 | holder.tvXXX = (TextView)findViewById(R.id.xxx); |
06 | //...一连串的findViewById |
07 | } |
08 | else { |
09 | holder = (ViewHolder) convertView.getTag(); |
10 | } |
11 |
12 |
13 |
14 | private static class ViewHolder{ |
15 | TextView tvXXX; |
16 | //很多view的定义 |
17 | } |
ViewHolder这么写(只提供一个静态方法,其实可以加一个私有构造函数防止外部实例化),代码很简单,看过就明白了
01 | public class ViewHolder { |
02 | // I added a generic return type to reduce the casting noise in client code |
03 | @SuppressWarnings ( "unchecked" ) |
04 | public static <T extends View> T get(View view, int id) { |
05 | SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); |
06 | if (viewHolder == null ) { |
07 | viewHolder = new SparseArray<View>(); |
08 | view.setTag(viewHolder); |
09 | } |
10 | View childView = viewHolder.get(id); |
11 | if (childView == null ) { |
12 | childView = view.findViewById(id); |
13 | viewHolder.put(id, childView); |
14 | } |
15 | return (T) childView; |
16 | } |
17 | } |
01 | @Override |
02 | public View getView( int position, View convertView, ViewGroup parent) { |
03 |
04 | if (convertView == null ) { |
05 | convertView = LayoutInflater.from(context) |
06 | .inflate(R.layout.banana_phone, parent, false ); |
07 | } |
08 |
09 | ImageView bananaView = ViewHolder.get(convertView, R.id.banana); |
10 | TextView phoneView = ViewHolder.get(convertView, R.id.phone); |
11 |
12 | BananaPhone bananaPhone = getItem(position); |
13 | phoneView.setText(bananaPhone.getPhone()); |
14 | bananaView.setImageResource(bananaPhone.getBanana()); |
15 |
16 | return convertView; |
17 | } |
值得注意的是SparseArray这个知识点,优化过的存储integer和object键值对的hashmap,网上资料很多这里就不废话了~
其实这种写法本质和ViewHolder Partten没有什么不同,ViewHolder Partten是把一个自定义类绑定到一个view,这种是把SparseArray绑定到一个view,虽然SparseArray 初始化会分配10长度的地址,理论上貌似浪费了内存,理论上插入和删除操作也是有时间损耗的,但是这些都在允许范围内。
比如https://github.com/JoanZapata/base-adapter-helper 作者也说了他做了大量测试,这种损耗微乎其微。
再次,万一万一因特殊情况发现了有性能瓶颈,到时候再优化就可以了,但是绝大多数场合都是可以使用的,大量简化你的开发,加快开发速度,代码少了,出错的几率就小了,维护的成本也小了~好处还是大大的。
简单的纸上分析~:
(1)ViewHolder Pattern是每一个View一个ViewHolder,里面是记录listitem内控件引用; SparseArray是记录id和控件引用的键值对,当然SparseArray初始化会分配一定地址空间(默认是10),但是这些内存损耗应该是可以忽略的~
(2)SparseArray是优化过的int-object的hashmap,使用折半查找,并优化了内存分配,所以代码执行成本通常是可控的。
综上,使用SparseArray与ViewHolder相比是有损耗,但应该是可控的。使用SparseArray优点是加快开发速度和减少代码维护,当发现有性能瓶颈时,再进行优化~
相关文章推荐
- [Android分享] ViewHolder模式超简洁写法,很cool!
- ViewHolder模式超简洁写法,很cool!
- ViewHolder模式超简洁写法,很cool!
- ViewHolder模式超简洁写法,很cool!
- ViewHolder模式超简洁写法,很cool!
- ViewHolder模式超简洁写法,很cool!
- ViewHolder模式超简洁写法,很cool
- 【轉】ViewHolder模式超简洁写法
- ViewHolder模式超简洁写法
- ViewHolder模式简洁写法
- ViewHolder模式超简洁写法,绝对精彩!
- ViewHolder模式超简洁写法
- ViewHolder模式超简洁写法,酷到没朋友!!!
- Android中ViewHolder模式超简洁写法(一劳永逸)
- ViewHolder模式超简洁写法
- ViewHolder模式的简洁写法
- ViewHolder模式超简洁写法
- 【工具类】ViewHolder模式超简洁写法
- android ViewHolder模式超简洁写法
- ViewHolder模式超简洁写法