Android讓多型別Adapter從此變的簡單
阿新 • • 發佈:2019-01-04
如果能夠以最少的程式碼實現功能,那簡直是程式設計師的福音,對於列表,每次如果都要寫一次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