封装 ViewHolder
简单分析ViewHolder封装。ViewHolder内部正常是保存每个页面控件的索引,那么封装时候我们可以使用容器把每个Item布局中的所有控件存储到这个容器里面,每次使用时候从容易查询.这里用Map可以实现。也可以使用SparseArray替换,SparseArray比Map效率更高。
/**
* 封装ViewHolder工具类
* @author IsCoding
*/
public class ViewHolder {
private final HashMap mViews;
private View mConvertView;
public ViewHolder(Context context, ViewGroup parent, int layoutId,
int position) {
this.mViews = new HashMap();
mViews.clear();
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
mConvertView.setTag(this);
}
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, layoutId, position);
}
return (ViewHolder) convertView.getTag();
}
public T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
下面看一下使用封装后的ViewHolder的效果
package com.iscoding.mobile.adaptertest.test2.adapter;
import java.util.List;
import com.iscoding.mobile.adaptertest.R;
import com.iscoding.mobile.adaptertest.test2.ViewHolder;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyAdapter2 extends BaseAdapter {
private LayoutInflater mInflater;
private Context mContext;
private List mDatas;
public MyAdapter2(Context context, List mDatas) {
mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mDatas = mDatas;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public Object getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 实例化一个viewHolder
ViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent,
R.layout.item_1, position);
// 通过getView获取控件
TextView tv = viewHolder.getView(R.id.text_title);
// 使用
tv.setText(mDatas.get(position));
return viewHolder.getConvertView();
}
} 使用封装好的
ViewHolder 已经使代码看起来简洁非常多了。