为什么要抽取呢?
因为每次都要写重复的代码,写一次还好写多了,自然就不合适了
-
我们首先观察,每次都要进行一次设置个数啊,返回list的对应对象,判断不为空啊,如下所示:
public int getCount() {
if (mDatas != null) {
return mDatas.size();
}
return 0;
}
public Object getItem(int position) {
if (mDatas != null) {
return mDatas.get(position);
}
return null;
}
public long getItemId(int position) {
return position;
}
-
我们发现可以把这三个方法抽取出来,放到一个我自己的BaseMyAdapter中
public class BaseMyAdapter extends BaseAdapter
- 可是我们接着又发现数据我们不知道如何获取到啊...
每次当我们给listview等设置Adapter的时候都是要new出来,突然我发现可以在构造函数中设置数据,而类型我可以设置成泛型,
BaseMyAdapter<T>
类名也要加上泛型
暂时的BaseAdapter算是抽取结束了(暂时),同时我们发现每次都要定义ViewHolder类 这个我们可以抽取吗?(答案是可以的)
- 我们可以首先对这个主页的holder进行抽取,利用MAC思想,定义一个BaseHolder
-
我们发现无非每次都是要获取view,并且添加进tag中
public abstract class BaseHolder<T> { public View mRootView; public BaseHolder() { mRootView = initView(); mRootView.setTag(this); } // 相当于我进行了初始化这个item的布局 public abstract View initView(); // 我要进行数据的添加和ui的更新 public abstract void setDatasAndRefreshUI(T datas); }
在这里我们知道到底要加载什么样item这个类并不知道,可是又要必须实现,我们则定义成抽象方法,让具体实现子类完成
-
这时我们可以进行对BaseAdapter进一步的抽取
public View getView(int position, View convertView, ViewGroup parent) { BaseHolder<T> holder = null; if (convertView == null) { holder = getHolder(); } else { holder = (BaseHolder<T>) convertView.getTag(); } // 添加数据,进行UI界面的刷新 holder.setDatasAndRefreshUI(mDatas.get(position)); return holder.mRootView; } public abstract BaseHolder<T> getHolder();
因为具体要加载哪个view并不知道,这里我们设置成抽象方法,让具体的子类进行实现
-
这时如果要继承BaseMyAdapter就会变成这个样子
private class MyDatasAdapter extends BaseMyAdapter<String> { public MyDatasAdapter(List<String> mDatas) { super(mDatas); } public BaseHolder<String> getHolder() { return new HomeHolder(); } }
代码中具体的homeHolder如下:
public class HomeHolder extends BaseHolder<String> {
private TextView mTvtmp1;
private TextView mTvtmp2;
public HomeHolder() {
super();
}
public View initView() {
// 相当于我进行了初始化这个item的布局
View mRootView = View.inflate(UIUtils.getContext(),
R.layout.item_temp_listview, null);
mTvtmp1 = (TextView) mRootView.findViewById(R.id.item_temp_tv1);
mTvtmp2 = (TextView) mRootView.findViewById(R.id.item_temp_tv2);
return mRootView;
}
public void setDatasAndRefreshUI(String datas) {
// 我要进行数据的添加和ui的更新
mTvtmp1.setText("头" + datas);
mTvtmp2.setText("尾巴" + datas);
}
}
-
最终BaseHolder:
public abstract class BaseHolder<T> {
public View mRootView;
public BaseHolder() {
mRootView = initView();
mRootView.setTag(this);
}
// 相当于我进行了初始化这个item的布局
public abstract View initView();
// 我要进行数据的添加和ui的更新
public abstract void setDatasAndRefreshUI(T datas);
}
-
最终BaseMyAdapter:
public abstract class BaseMyAdapter<T> extends BaseAdapter {
private List<T> mDatas;
/** 通过构造获取数据 */
public BaseMyAdapter(List<T> mDatas) {
this.mDatas = mDatas;
}
public int getCount() {
if (mDatas != null) {
return mDatas.size();
}
return 0;
}
@Override
public Object getItem(int position) {
if (mDatas != null) {
return mDatas.get(position);
}
return null;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder<T> holder = null;
if (convertView == null) {
holder = getHolder();
} else {
holder = (BaseHolder<T>) convertView.getTag();
}
// 添加数据,进行UI界面的刷新
holder.setDatasAndRefreshUI(mDatas.get(position));
return holder.mRootView;
}
public abstract BaseHolder<T> getHolder();
}
转载需注明来源