RecyclerView适配器的超省写法

原文出处:http://www.jianshu.com/p/1cec183729f6 

RecycleView 作为新出的控件.他规范了 Viewholder 的写法.
但是总感觉适配器的写法过于冗长.怎么办呢?
我们来简化他.
ViewHolder 的实现方式和ListView适配器的超省写法中的ViewHodler 是一样的
ViewHolder.class

public class ViewHolder {
    private SparseArray<View> viewHolder;
    private View view;
    public static  ViewHolder getViewHolder(View view){
        ViewHolder viewHolder = (ViewHolder) view.getTag();
        if (viewHolder == null) {
            viewHolder = new ViewHolder(view);
            view.setTag(viewHolder);
        }
        return viewHolder;
    }
    private ViewHolder(View view) {
        this.view = view;
        viewHolder = new SparseArray<View>();
        view.setTag(viewHolder);
    }
    public <T extends View> T get(int id) {
        View childView = viewHolder.get(id);
        if (childView == null) {
            childView = view.findViewById(id);
            viewHolder.put(id, childView);
        }
        return (T) childView;
    }
    public View getConvertView() {
        return view;
    }
    public TextView getTextView(int id) {
        return get(id);
    }
    public Button getButton(int id) {
        return get(id);
    }
    public ImageView getImageView(int id) {
        return get(id);
    }
    public void setTextView(int  id,CharSequence charSequence){
        getTextView(id).setText(charSequence);
    }
}

我们继承 RecyclerView.Adapter
AutoRVAdapter.class

public abstract class AutoRVAdapter extends RecyclerView.Adapter<RVHolder> {
    public List<?> list;
    private Context context;
    public AutoRVAdapter(Context context, List<?> list) {
        this.list = list;
        this.context = context;
    }
    @Override
    public RVHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(onCreateViewLayoutID(viewType), null);
        return new RVHolder(view);
    }
    public abstract int onCreateViewLayoutID(int viewType);
    @Override
    public void onViewRecycled(final RVHolder holder) {
        super.onViewRecycled(holder);
    }
    @Override
    public void onBindViewHolder(final RVHolder holder, final int position) {
        onBindViewHolder(holder.getViewHolder(), position);
        if (onItemClickListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onItemClickListener.onItemClick(null, v, holder.getPosition(), holder.getItemId());
                }
            });
        }
    }
    public abstract void onBindViewHolder(ViewHolder holder, int position);
    @Override
    public int getItemCount() {
        return list.size();
    }
    private AdapterView.OnItemClickListener onItemClickListener;
    public AdapterView.OnItemClickListener getOnItemClickListener() {
        return onItemClickListener;
    }
    public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }
}

RVHolder.class 继承 RecyclerView.ViewHolder

public class RVHolder  extends RecyclerView.ViewHolder {
    private ViewHolder viewHolder;
    public RVHolder(View itemView) {
        super(itemView);
        viewHolder=ViewHolder.getViewHolder(itemView);
    }
    public ViewHolder getViewHolder() {
        return viewHolder;
    }
}

到此,结束了
我们新写的适配器继承AutoRVAdapter 实现onCreateViewLayoutID 和 onBindViewHolder 方法即可.
onCreateViewLayoutID->返回item 的布局.
onBindViewHolder->绑定数据源.

public class DemoRVAdapter extends AutoRVAdapter {
    public RecyclerAdapter(Context context, List<?> list) {
        super(context, list);
    }
    @Override
    public int onCreateViewLayoutID(int viewType) {
        return R.layout.item;
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Entity item=(Entity) list.get(position);
        vh.getTextView(R.id.name).setText(item.getName());
        vh.getTextView(R.id.age).setText(item.getAge());
        vh.setText(R.id.height,item.getHeight()); 
    }
}