是否对每次写BaseAdapter感到厌烦,下面给出一个简单的封装:
public class EasyAdapter<D, H extends EasyAdapter.ViewHolder> extends BaseAdapter{
protected static class ViewHolder{
public View itemView;
public ViewHolder(View itemView){
if (itemView == null) {
throw new IllegalArgumentException("itemView may not be null");
}
this.itemView = itemView;
}
}
public interface Capacity<D, H extends ViewHolder>{
H onCreateViewHolder(ViewGroup parent, int viewType);
void onBindViewHolder(D data, H holder);
}
private List<D> datas = new ArrayList<>();
private Capacity<D, H> capacity;
public EasyAdapter(Capacity<D, H> capacity){
this.capacity = capacity;
}
public void addData(D data){
this.datas.add(data);
notifyDataSetChanged();
}
public void updateData(List<D> datas){
this.datas = datas;
notifyDataSetChanged();
}
@Override
public int getCount() {
return datas.size();
}
@Override
public D getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null){
H holder = capacity.onCreateViewHolder(parent, getItemViewType(position));
v = holder.itemView;
v.setTag(holder);
}else{
v = convertView;
}
D item = getItem(position);
capacity.onBindViewHolder(item, (H)v.getTag());
return v;
}
}
其中D代表item对应的数据Bean类型,H代表item对应的View相应的ViewHolder类型。
下面是使用,首先是Bean:
public class TestCaseBean {
public String testName;
public Runnable testCase;
public TestCaseBean(String testName, Runnable testCase){
this.testName = testName;
this.testCase = testCase;
}
}
然后是Adapter和ViewHolder:
private static class CaseViewHolder extends EasyAdapter.ViewHolder{
private TextView tv;
protected CaseViewHolder(View itemView){
super(itemView);
tv = (TextView) itemView;
}
}
private class CaseAdapter extends EasyAdapter<TestCaseBean, CaseViewHolder>{
public CaseAdapter() {
super(new Capacity<TestCaseBean, CaseViewHolder>() {
@Override
public CaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
CaseViewHolder viewHolder = new CaseViewHolder(new TextView(MainActivity.this));
return viewHolder;
}
@Override
public void onBindViewHolder(TestCaseBean data, CaseViewHolder holder) {
TextView tv = holder.tv;
tv.setText(data.testName);
}
});
}
}
Adapter的代码是仿照RecyclerView来实现的。
是不是觉得世界往更美好的方向近了一点?