设为首页收藏本站
查看: 377|回复: 0

ViewHolder模式超简洁写法,很cool!

[复制链接]

75

主题

75

帖子

442

积分

网站编辑

Rank: 8Rank: 8

积分
442
发表于 2017-1-18 10:30:06 | 显示全部楼层 |阅读模式
ViewHolder是什么就不解释了。
        大家通常怎么写ViewHolder呢?
  1. ViewHolder holder = null;
  2.         if(convertView == null){
  3.                 convertView = mInflater.inflate(R.layout.xxx null);
  4.                 holder = new ViewHolder();
  5.                 holder.tvXXX = (TextView)findViewById(R.id.xxx);
  6.                 //...一连串的findViewById
  7.         }
  8.         else{
  9.                 holder = (ViewHolder) convertView.getTag();  
  10.         }
  11.         
  12.         
  13.         
  14.         private static class ViewHolder{
  15.                 TextView tvXXX;
  16.                 //很多view的定义
  17.         }
复制代码
   这么写一次还行,但问题是总有很多很多的ViewAdapter要这么写,每次都repeat,repeat,repeat  累啊。      所以,有这么一种简洁的写法分享给大家,先声明,从国外网站上看的,不是自己原创的,但确实很喜欢这个简洁的设计。

ViewHolder这么写(只提供一个静态方法,其实可以加一个私有构造函数防止外部实例化),代码很简单,看过就明白了
  1. public class ViewHolder {
  2.     // I added a generic return type to reduce the casting noise in client code
  3.     @SuppressWarnings("unchecked")
  4.     public static <T extends View> T get(View view, int id) {
  5.         SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
  6.         if (viewHolder == null) {
  7.             viewHolder = new SparseArray<View>();
  8.             view.setTag(viewHolder);
  9.         }
  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. }
复制代码
在getView里这样
  1. @Override
  2. public View getView(int position, View convertView, ViewGroup parent) {

  3.     if (convertView == null) {
  4.         convertView = LayoutInflater.from(context)
  5.           .inflate(R.layout.banana_phone, parent, false);
  6.     }

  7.     ImageView bananaView = ViewHolder.get(convertView, R.id.banana);
  8.     TextView phoneView = ViewHolder.get(convertView, R.id.phone);

  9.     BananaPhone bananaPhone = getItem(position);
  10.     phoneView.setText(bananaPhone.getPhone());
  11.     bananaView.setImageResource(bananaPhone.getBanana());

  12.     return convertView;
  13. }
复制代码
  哈哈,完成了,果断把这个ViewHolder类加入自己的utils,一劳永逸了以后~
        值得注意的是SparseArray这个知识点,优化过的存储integer和object键值对的hashmap,网上资料很多这里就不废话了~
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

推荐阅读 More>
广告位

Powered by Discuz X3.2

© 2001-2016   

合作伙伴

返回顶部 返回列表