Android点滴---ViewHolder通用,优雅写法


最近在做项目时,又要写 ViewHolder,

突然想到网上看看有没什么好的写法!


不知道你是不是也烦透了写那些没有技术含量的ViewHolder

看看这些,或许会有收获!


然后就找到了下面两篇文章(感谢分享!):


ViewHolder超简洁写法 点击跳转


优雅的使用ViewHolder 点击跳转


然后自己整理的了, 保存起来,省的忘记,顺便分享一下!


直接贴代码了:


第一种:
import android.util.SparseArray;
import android.view.View;

/**
 * ViewHolder 的通用写法
 * 
 * 来自 : http://www.eoeandroid.com/thread-321547-1-1.html
 * 
 * @author LiuJinpeng
 *
 */
public class ViewHolder {
	
	private ViewHolder() {}

	@SuppressWarnings("unchecked")
	public static <T extends View>T getChildView(View convertView,int id) {
		
		SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag();
		
		if (viewHolder == null) {
			viewHolder = new SparseArray<View>();
			convertView.setTag(viewHolder);
		}
		
		View childView = viewHolder.get(id);
		
		if (childView == null) {
			childView = convertView.findViewById(id);
			viewHolder.put(id, childView);
		}
		
		return (T) childView;
	}
	
}

使用方法:

@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;
}

第二种:
import android.util.SparseArray;
import android.view.View;

/**
 * ViewHolder 优雅写法
 * 
 * 来自:http://stackvoid.com/using-adapter-in-efficiency-way/
 * 
 * @author LiuJinpeng
 *
 */
public class ViewHolder2 {

	private final SparseArray<View> views;
	
	private View convertView;
	
	private ViewHolder2(Context context, int layoutId) {
		super();
		this.views = new SparseArray<View>();

		this.convertView = View.inflate(context, layoutId, null);
		
		convertView.setTag(this);
	}
	

	/**
	 * 获取 holder
	 * 
	 * @param context
	 * @param convertView	getView 的 convertView
	 * @param layoutId		item View 的  布局文件 id
	 * @return
	 */
	public static ViewHolder2 getHolder(Context context, View convertView,int layoutId) {
		
		if (convertView.getTag() == null) {
			return new ViewHolder2(context, layoutId);
		}
		
		return (ViewHolder2) convertView.getTag();
	}

	@SuppressWarnings("unchecked")
	public <T extends View>T getChildView(int viewId) {
		View childView = views.get(viewId);
		
		if (childView == null) {
			childView = convertView.findViewById(viewId);
			views.put(viewId, childView);
		}
		
		return (T) childView;
	}

	public View getConvertView() {
		return convertView;
	}

}


使用方法:

public View getView(int position, View convertView, ViewGroup parent) {

		ViewHolder mViewHolder = ViewHolder.get(context,convertView,layoutId);
		TextView price = mViewHolder.getView(R.id.price);
		// ...其他getView

		return mViewHolder.getConvertView();
	}


其中第一篇文章还分享了一个框架:

base-adapter-helper 点击打开链接


暂时没时间研究,有兴趣的同学可以看一下!


从事Android开发不久,有问题,希望大家留言交流,共同成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值