现在做新项目,每次ListView或GridView用adapter的时候,都要写一大堆。于是我写了一个AdapterCopy的类,每次用的时候都全部复制过去。受够了这种复制粘贴,今天突发奇想,为什么不把Adapter封装一下,让它和封装后的Activity一样好用?
adapter设计思路(adapter理想模型):
1、getView() 。返回型为int,即和activity一样,只需要返回一个布局id。
@Override
protected int layoutInit() {
return R.layout.activity_test;
}
2、bindEvent(Holder holder,int position)。同activity一样,里面只需要处理相应逻辑,不同的是需要holder,position参数(adapter没有这两个参数没法玩啊)。
3、getHolder(View v)。主要用于返回holder类型。(理想模型没有这一方法。暂时没想到怎么去掉)
由于需要让adapter自动判断里面数据集合类型和Holder类型,所以必须要用到泛型。
贴代码:
AbstractAdapter:
/**
* Hoyn
* 第一个泛型为数据类型,第二个泛型为holder类型
* Created by a on 2016/6/12.
*/
public abstract class AbstractAdapter<E, T extends BaseHolder> extends BaseAdapter {
protected List<E> data = new ArrayList<E>();
protected Context context;
public AbstractAdapter() {
}
public AbstractAdapter(List<E> list) {
this.data = list;
}
public List<E> getData() {
return data;
}
public void setData(List<E> data) {
this.data = data;
notifyDataSetChanged();
}
/**
* 增加全部list
*
* @param data
*/
public void addDatas(List<E> data) {
this.data.addAll(data);
notifyDataSetChanged();
}
/**
* 增加某个item
*
* @param data
*/
public void addData(E data) {
this.data.add(data);
notifyDataSetChanged();
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**
* 删除某项item
*
* @param position
*/
public void delItem(int position) {
if (data != null && data.size() > position) {
data.remove(position);
this.notifyDataSetChanged();
}
}
/**
* 删除全部
*/
public void delAll() {
data.clear();
this.notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
context = parent.getContext();
T holder = null;
if (convertView == null) {
//getView()的抽象方法,返回值为int
convertView = getItemView(getView(), parent);
//通过泛型自动转换holder类型,由于butterknife需要在holder里面绑定控件,所以不能写成同一个holder,而需要自动转换。
holder = getHolder(convertView);
convertView.setTag(holder);
} else {
holder = (T) convertView.getTag();
}
//逻辑处理的抽象方法
bindEvent(holder,position);
return convertView;
}
//三个抽象方法
protected abstract T getHolder(View v);
protected abstract int getView();
protected abstract void bindEvent(T holder,int position);
protected View getItemView(int id, ViewGroup parent) {
return LayoutInflater.from(parent.getContext()).inflate(id, parent, false);
}
}
BaseHolder:
/**
* Hoyn
* 很简单,只有butterknife基本功能
* Created by a on 2016/6/12.
*/
public abstract class BaseHolder {
public BaseHolder(View view) {
ButterKnife.bind(this, view);
}
}
实现
TestAdapter:
/**
* Hoyn
* 本例的data为List<String>
* Created by a on 2016/6/12.
*/
public class TestAdapter extends AbstractAdapter<String,TestAdapter.MyHolder> {
@Override
protected MyHolder getHolder(View v) {
return new MyHolder(v);
}
@Override
protected int getView() {
return R.layout.item_test;
}
@Override
protected void bindEvent(MyHolder holder,int position) {
holder.tv.setText(data.get(position));
}
protected class MyHolder extends BaseHolder {
@Bind(R.id.textView)
TextView tv;
public MyHolder(View view) {
super(view);
}
}
}
怎么样,是不是看起来舒服多了?
@Override
protected MyHolder getHolder(View v) {
return new MyHolder(v);
}
如果能把这部分去掉就更舒服了,期待我以后的更新吧。
TestActivity:
/**
* Created by a on 2016/6/12.
*/
public class TestActivity extends BaseActivity{
@Bind(R.id.lv_test)
ListView lv;
TestAdapter adapter = new TestAdapter();
@Override
protected int layoutInit() {
return R.layout.activity_test;
}
@Override
protected void binEvent() {
lv.setAdapter(adapter);
monidata();
}
private void monidata(){
List<String> data = new ArrayList<>();
for (int a=0;a<20;a++){
data.add("测试:"+a);
}
adapter.setData(data);
}
}
效果图: