您的位置:首页 > 其它

对BaseAdapter进行封装

2016-08-17 12:58 260 查看
对于Android开发者来讲,ListView控件肯定不陌生。它是用来以列表的形式展现数据,在项目开发中经常会用到。

要想使用ListView展现数据,必须执行ListView的setAdapter方法,将数据填充给ListView。相信大家对Adapter的写法并不陌生,以下为常用的写法:

class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return postion;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = View.inflate(R.layout.list_item);
holder = new ViewHolder();
holder.tvTitle = (TextView)convertView.findViewById(R.id.tvTitle);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.tvTitle.setText(getItem(position).title);
return convertView;
}
}

class ViewHolder {
public TextView tvTitle;
}


如果项目中使用ListView比较多,那么每次都要重新写一遍Adapter继承BaseAdapter,为了解决这种重复编写的问题。将BaseAdpater进行封装

public abstract class MyBaseAdapter<T> extends BaseAdapter {

private ArrayList<T> data;

public MyBaseAdapter(ArrayList<T> data) {
this.data = data;
}

@Override
public int getCount() {
return data.size();
}

@Override
public T getItem(int position) {
return data.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder holder;
if (convertView == null) {
// 1. 加载布局文件
// 2. 初始化控件 findViewById
// 3. 打一个标记tag
holder = getHolder();// 子类返回具体对象
} else {
holder = (BaseHolder) convertView.getTag();
}
holder.setData(getItem(position));
return holder.getRootView();
}
// 返回当前页面的holder对象, 必须子类实现
public abstract BaseHolder<T> getHolder();
}


public abstract class BaseHolder<T> {

private View mRootView;// 一个item的根布局

private T data;

//当new这个对象时, 就会加载布局, 初始化控件,设置tag
public BaseHolder() {
mRootView = initView();
// 3. 打一个标记tag
mRootView.setTag(this);
}

// 1. 加载布局文件
// 2. 初始化控件 findViewById
public abstract View initView();

// 返回item的布局对象
public View getRootView() {
return mRootView;
}

// 设置当前item的数据
public void setData(T data) {
this.data = data;
refreshView(data);
}

// 获取当前item的数据
public T getData() {
return data;
}

// 4. 根据数据来刷新界面
public abstract void refreshView(T data);

}


这样,在编写Adpater的时候,只需要继承MyBaseAdpater并实现相应构造方法与抽象方法,然后编写对应Holder集成BaseHolder即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: