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


优化篇 第二篇

      
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值