如果能够以最少的代码实现功能,那简直是程序员的福音,对于列表,每次如果都要写一次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