ViewHolder的封装
protected static class ViewHolder {
private View convertView;
private SparseArray<View> views;
private ViewHolder(View convertView) {
this.views = new SparseArray<View>();
this.convertView = convertView;
convertView.setTag(this);
}
public static ViewHolder getInstance(Context context, View convertView, int layout) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(layout, null);
return new ViewHolder(convertView);
}
return (ViewHolder) convertView.getTag(); // 重用convertView
}
@SuppressWarnings("unchecked")
public <T extends View> T findViewById(int id) {
View view = views.get(id); // 同id的控件可重复使用,无需再次findViewById
if (view == null) {
view = convertView.findViewById(id);
views.append(id, view); // 将此id的控件添加进sparseArray
}
return (T) view;
}
private View getConvertView() {
return convertView;
}
}
MyBaseAdapter
public abstract class MyBaseAdapter<T> extends BaseAdapter {
protected Context mContext;
protected List<T> mList; // 数据
protected int mLayout; // 布局id
public MyBaseAdapter(Context context, List<T> list, int layout) {
this.mContext = context;
this.mList = list;
this.mLayout = layout;
}
@Override
public int getCount() {
return mList == null ? 0 : mList.size();
}
@Override
public Object getItem(int position) {
return mList == null ? null : mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = ViewHolder.getInstance(mContext, convertView, mLayout);
convert(holder, mList.get(position)); // 子类重写的方法,完成holder中view的初始化
return holder.getConvertView();
}
/**
* 子类必须重写的方法,通过这个方法初始化holder中的View即可
*/
public abstract void convert(ViewHolder holder, T t);
}
那么 自己写的testadapter
public class TestAdapter extends MyBaseAdapter<Person> {
private ImageView image;
private TextView name;
/**
* @param list 数据
* @param layout 布局id
*/
public TestAdapter(Context context, List<Person> list, int layout) {
super(context, list, layout);
}
@Override
public void convert(ViewHolder holder, Person person) {
image = holder.findViewById(R.id.image); // 这里是找到控件并且设置内容
name = holder.findViewById(R.id.name);
image.setImageResource(R.mipmap.ic_launcher);
name.setText(person.getName());
}
}
好的 可以使用了 。Person是bean 两个属性 img和textview