进一步简化你的 ViewHolder


目前在写项目的过程中,虽然 RecyclerView 已经出来很久了,但是仍有一部分朋友(包括我)再继续使用着 ListView,GridView . 
在使用的过程中,使用 ViewHolder 进行 ListView,GridView 的优化,是必不可少的,所以,我们每次在 getView 的方法中 都会去利用 ViewHolder 去进行 View 的复用。 
写法如下:


@Overridepublic View getView(int position, View convertView, ViewGroup parent) { //ViewHolder ViewHolder viewHolder=null; //绘制每一项的时候先判断convertView是否为空,不为空,则else里面去复用,为空,则重新赋予item布局 if (convertView == null) { //new出ViewHolder ,初始化布局文件 viewHolder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate(R.layout.item_test, null); viewHolder.tv_name= (TextView) convertView.findViewById(R.id.tv_name); //调用convertView的setTag方法,将viewHolder放入进去,用于下次复用 convertView.setTag(viewHolder); } else { //复用已经存在的item的项 viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.tv_name.setText(listBeans.get(position)); return convertView; } class ViewHolder { TextView tv_name; }


<span style="color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px; background-color: rgb(255, 255, 255);">这样的写法使得我们即便 Item 里面只有一两个控件,也都要去写一个 ViewHolder ,这也就算了,如果 Item 里面控件多了,我们就需要花费一定的时间先去创建 ViewHolder。 不知道有没有朋友想过寻找一些简化的方法。</span>

我这里整理出一个简化使用 ViewHolder 的方法,相对于创建上面的 getTag() setTag(), 要优雅许多,并且在使用上,也避免了做一些重复性的工作。 
这里直接写为一个工具类:

public class ViewHolder { 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 中使用方式为:

@Overridepublic View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_test, null); } TextView tv_name = ViewHolder.get(convertView , R.id.tv_name); tv_name.setText(listBeans.get(position)); return convertView; }

相对于上面的第一种写法,是不是更加的简洁,优雅~

这里作为平时的积累,希望能给一些朋友带来帮助~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值