打造属于你自己的BaseAdapter

转载请注明出处:http://blog.csdn.net/KevinsCSDN/article/details/51747631
今天看到队友写的Adapter,这么多重复的代码,这也能忍???反正我是不能忍,于是动手将ListView的adapter封装了一下:
1. 构造方法不用传入ArrayList的引用,我在内部已经new啦;
2. getCount()、getItem()、getItemId这种活就不要再干啦;
3. getView获取ViewHolder的过程你也不用干啦;
4. 至于add、addAll,remove,removeAll这种操作也不再需要notifyDataSetChanged了。
你需要做的只是:
1. 继承BaseListAdapter,内部创建继承BaseListAdapter.ViewHolder的静态内部类YourAdapter.ViewHolder,然后将元素类型和这个ViewHolder传进泛型。
2. 重写getLayoutResId,传入布局文件
3. 如果使用ButterKnife,将生成的ViewHolder与创建的ViewHolder整合
4. 重写onBindViewHolder,返回ViewHolder的实例
5. onBindViewHolder,将数据与View绑定
废话不多说,直接上代码:

/**
 * Caused by Kevin at 2016/6/23
 */
public abstract class BaseListAdapter extends BaseAdapter {

    protected Context context;
    protected List list;
public BaseListAdapter(Context context, List list) {
        this.context = context;
        list = new ArrayList<>();
    }

    public BaseListAdapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list != null ? list.size() : 0;
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        VH holder;
        if(convertView==null){
            convertView = LayoutInflater.from(context).inflate(getLayoutResId(),parent,false);
            RelayoutUtil.relayoutViewHierarchy(convertView);
            holder = onCreateViewHolder(convertView);
            convertView.setTag(holder);
        }else {
            holder = (VH) convertView.getTag();
        }
        T t = list.get(position);
        bindViewHolder(holder,t);
        return convertView;
    }

    public void add(T t){
        list.add(t);
        notifyDataSetChanged();
    }

    public void addAll(Collection collection){
        list.addAll(collection);
        notifyDataSetChanged();
    }

    public void remove(T t){
        list.remove(t);
        notifyDataSetChanged();
    }

    public void removeAll(Collection collection){
        list.remove(collection);
        notifyDataSetChanged();
    }

    public abstract int getLayoutResId();

    protected abstract VH onCreateViewHolder(View convertView);

    public abstract void bindViewHolder(VH holder, T t);

    public static class ViewHolder{

        public ViewHolder(View view) {

        }
    }
}

继承之后是这样,看一下是不是省了很多代码?

/**
 * Caused by Kevin at 2016/6/23
 */
public class YourAdapter extends BaseListAdapter<YourEntity, YourAdapter.ViewHolder> {

    public YourAdapter(Context context) {
        super(context);
    }

    @Override
    public int getLayoutResId() {
        return R.layout.adapter_yours;
    }

    @Override
    protected ViewHolder onCreateViewHolder(View convertView) {
        return new ViewHolder(convertView);
    }

    @Override
    public void bindViewHolder(ViewHolder holder, YourEntity yourEntity) {
        holder.avatarImage.setImageUri(yourEntity.getImageUri());
        holder.nickText.setText(yourEntity.getNick());
    }

    static class ViewHolder extends BaseListAdapter.ViewHolder {
        @Bind(R.id.avatar_image)
        SimpleDraweeView avatarImage;
        @Bind(R.id.nick_text)
        TextView nickText;

        ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }
}

在Activity里这样用,是不是很优雅:

ListView mListView;
YourAdapter adapter = new YourAdapter(this);
mListView.setAdapter(adapter);
ArrayList list = getYourEntityList();
adapter.addAll(list)

你可能感兴趣的:(控件)