Android让多类型Adapter从此变的简单

     如果能够以最少的代码实现功能,那简直是程序员的福音,对于列表,每次如果都要写一次Adapter,然后在写一个ViewHolder是不是很烦,是不是很累,那我们就站在前人的肩膀上撸一发。

      就拿ReCycleView.Adapter来说,如果是多种类型,有两个方法是我们最烦的,getItemViewType和onBindViewHolder,因为这两个方法我们不得不去switch,所以我们就对他们下手。

       下面我们在宏观上分析一下,每一个position的数据只有它自己知道我是什么类型,也只有它自己知道该怎么去填充数据,所以我们可以抽取一个接口如下:

/**
 * Created by WangZhanXian on 2018/4/12.
 */

public interface Cell {

   public @LayoutRes int layoutId();

   public void bindView(ViewHolder holder,int position);
}

        其实一个更大的巧合的是,每一种类型都对应一种自己特有的布局文件,布局文件的Id正好也是int类型的,赶巧的是getItemIViewType这个方法也是需要一个int类型的,这简直深得我心啊,请看下面一行搞定的代码:

    @Override
    public int getItemViewType(int position) {
        return mDatas.get(position).layoutId();
    }

      怎么样,这里的switch被我们干掉了,并且创建ViewHolder也更简单了如下:

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //现在viewType就是layoutId
        return ViewHolder.getHolder(mContext,viewType,parent);
    }

然后我们在解决另一个方法,直接上代码:

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        mDatas.get(position).bindView(holder,position);
    }

    就是这么简单,然后让我们的Model去实现Cell接口,返回相应的item布局文件的ID以及去绑定相应的数据,当然了ViewHolder依然是借鉴了前人的基础上:

public class ViewHolder extends RecyclerView.ViewHolder{

    private SparseArray mViews;
    private Context mContext;
    private View mConvertView;
    /**
     * init holder
     */
    public ViewHolder(Context context, View itemView) {
        super(itemView);
        mContext=context;
        mConvertView=itemView;
        mViews = new SparseArray();
    }
    /**
     *  获取viewHolder
     */
    public static ViewHolder getHolder(Context context, int layoutId, ViewGroup parent) {
        return new ViewHolder(context, LayoutInflater.from(context).inflate(layoutId, parent,
                false));
    }

    public View getConvertView(){
        return mConvertView;
    }

    /**
     * get view
     */
    public  T getView(int viewId){
        View view = mViews.get(viewId);
        if(view == null){
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId,view);
        }
        return (T)view;
    }

    /**
     * set text
     */
    public ViewHolder setText(int viewId, String text){
        TextView tv = getView(viewId);
        tv.setText(text);
        return this;
    }

    /**
     *  set image res
     */
    public ViewHolder setImageResource(int viewId,int resId){
        ImageView iv = getView(viewId);
        iv.setImageResource(resId);
        return this;
    }

    /**
     *  set image res
     */
    public ViewHolder setBackgroundRes(int viewId,int resId){
        TextView tv = getView(viewId);
        tv.setBackgroundResource(resId);
        return this;
    }

    /**
     *  set image bitmap
     */
    public ViewHolder setImageDraw(int viewId,Drawable drawable){
        ImageView iv = getView(viewId);
        iv.setImageDrawable(drawable);
        return this;
    }
    /**
     *  set check
     */
    public ViewHolder setIsCheck(int viewId,boolean isCheck){
        CheckBox iv = getView(viewId);
        iv.setChecked(isCheck);
        return this;
    }

}

        当然了,每一种抽取也可能会遇见新的问题,如果遇见新的需求和问题,欢迎给我留言,这里只是提供了一种思路和方法,以后再也不用担心Adapter了,省下的时间可以开心的和女朋友吃鸡荣耀啦。

哪来的女朋友,还是自己玩吧。

附上demo链接欢迎star


优化篇 第二篇

      

你可能感兴趣的:(Android让多类型Adapter从此变的简单)