1. 程式人生 > >Android讓多型別Adapter從此變的簡單

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<View> mViews;
    private Context mContext;
    private View mConvertView;
    /**
     * init holder
     */
    public ViewHolder(Context context, View itemView) {
        super(itemView);
        mContext=context;
        mConvertView=itemView;
        mViews = new SparseArray<View>();
    }
    /**
     *  獲取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 extends View> 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