Android笔记之ListView的ViewHolder超简洁写法

重写ListView的时候我们经常都会使用ViewHolder,但当前的写法看起来很复杂,在eoe上看到一种简单的写法,觉得很不错,现在分享给大家。

我们先看看原来的写法

if (convertView == null) {
        convertView = mInflater.inflate(R.layout.xxx null);
        holder = new ViewHolder(); 
        holder.tvXXX = (TextView)findViewById(R.id.xxx);
        //...一连串的findViewById
} else {
        holder = (ViewHolder) convertView.getTag();  
}
        
        
        
private static class ViewHolder{
        TextView tvXXX;
        //很多view的定义
}
当内部子控件很多的时候明显很不爽,现在给大家介绍一种新的写法

// ViewHolder这么写(只提供一个静态方法,其实可以加一个私有构造函数防止外部实例化),代码很简单,看过就明白了
public class ViewHolder {
    // I added a generic return type to reduce the casting noise in client code
    @SuppressWarnings("unchecked")
    public static <T extends View> T get(View view, int id) {
        SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
        if (viewHolder == null) {
            viewHolder = new SparseArray<View>();
            view.setTag(viewHolder);
        }
        View childView = viewHolder.get(id);
        if (childView == null) {
            childView = view.findViewById(id);
            viewHolder.put(id, childView);
        }
        return (T) childView;
    }
}


// 在getView里这样
@Override
public View getView(int position, View convertView, ViewGroup parent) {

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

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

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

    return convertView;
}
怎么样,是不是感觉代码很简洁。 SparseArray是android提供的类似HashMap的一个类,但做了一些优化,网上有很多相关资料,大家可以自己学习一下



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值