RecycleView+checkBox

实现效果:
这里写图片描述

1. 自定义 BaseViewHolder
public class BaseViewHolder extends RecyclerView.ViewHolder {

    private SparseArray<View> mViews;
    private View mConvertView;

    public BaseViewHolder(View itemView) {
        super(itemView);
        mViews = new SparseArray<View>();
        mConvertView = itemView;
    }

    /**
     * 通过viewId获取控件
     *
     * @param viewId
     * @return
     */
    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;
    }

    /**
     * 设置TextView的值
     *
     * @param viewId
     * @param text
     * @return
     */
    public void setText(int viewId, String text) {
        TextView tv = getView(viewId);
        tv.setText(text);
    }

    public void setText(int viewId, int resId) {
        TextView tv = getView(viewId);
        tv.setText(resId);
    }

    /**
     * 延迟处理消息
     * @param viewId
     * @param runnable
     * @param delayMillis
     */
    public void postDelayed(int viewId, Runnable runnable, long delayMillis) {
        View view = getView(viewId);
        view.postDelayed(runnable, delayMillis);
    }

    public void requestFocus(int viewId) {
        View view = getView(viewId);
        view.requestFocus();
    }

    public void setImageResource(int viewId, int resId) {
        ImageView view = getView(viewId);
        view.setImageResource(resId);
    }

    public void setImageBitmap(int viewId, Bitmap bitmap) {
        ImageView view = getView(viewId);
        view.setImageBitmap(bitmap);
    }

    public void setImageDrawable(int viewId, Drawable drawable) {
        ImageView view = getView(viewId);
        view.setImageDrawable(drawable);
    }

    public void setBackgroundColor(int viewId, int color) {
        View view = getView(viewId);
        view.setBackgroundColor(color);
    }

    public void setBackgroundRes(int viewId, int backgroundRes) {
        View view = getView(viewId);
        view.setBackgroundResource(backgroundRes);
    }

    public void setTextColor(int viewId, int textColor) {
        TextView view = getView(viewId);
        view.setTextColor(textColor);
    }

    public void setTextColorRes(int viewId, int color) {
        TextView view = getView(viewId);
        view.setTextColor(color);
    }

    @SuppressLint("NewApi")
    public void setAlpha(int viewId, float value) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            getView(viewId).setAlpha(value);
        } else {
            AlphaAnimation alpha = new AlphaAnimation(value, value);
            alpha.setDuration(0);
            alpha.setFillAfter(true);
            getView(viewId).startAnimation(alpha);
        }
    }

    public void setVisible(int viewId, boolean visible) {
        View view = getView(viewId);
        if (visible) {
            view.setVisibility(View.VISIBLE);
        } else {
            view.setVisibility(View.GONE);
        }
    }

    public void linkify(int viewId) {
        TextView view = getView(viewId);
        Linkify.addLinks(view, Linkify.ALL);
    }

    public void setTypeface(Typeface typeface, int... viewIds) {
        for (int viewId : viewIds) {
            TextView view = getView(viewId);
            view.setTypeface(typeface);
            view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
        }
    }

    public void setProgress(int viewId, int progress) {
        ProgressBar view = getView(viewId);
        view.setProgress(progress);
    }

    public void setProgress(int viewId, int progress, int max) {
        ProgressBar view = getView(viewId);
        view.setMax(max);
        view.setProgress(progress);
    }

    public void setMax(int viewId, int max) {
        ProgressBar view = getView(viewId);
        view.setMax(max);
    }

    public void setRating(int viewId, float rating) {
        RatingBar view = getView(viewId);
        view.setRating(rating);
    }

    public void setRating(int viewId, float rating, int max) {
        RatingBar view = getView(viewId);
        view.setMax(max);
        view.setRating(rating);
    }

    public void setTag(int viewId, Object tag) {
        View view = getView(viewId);
        view.setTag(tag);
    }

    public void setTag(int viewId, int key, Object tag) {
        View view = getView(viewId);
        view.setTag(key, tag);
    }

    public void setChecked(int viewId, boolean checked) {
        Checkable view = getView(viewId);
        view.setChecked(checked);
    }

    public void setEnabled(int viewId, boolean enabled) {
        View view = getView(viewId);
        view.setEnabled(enabled);
    }

    /**
     * 关于事件的
     */
    public void setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = getView(viewId);
        view.setOnClickListener(listener);
    }

    public void setOnTouchListener(int viewId, View.OnTouchListener listener) {
        View view = getView(viewId);
        view.setOnTouchListener(listener);
    }

    public void setOnLongClickListener(int viewId, View.OnLongClickListener listener) {
        View view = getView(viewId);
        view.setOnLongClickListener(listener);
    }

    public void setOnCheckedChangeListener(int viewId, CompoundButton.OnCheckedChangeListener listener) {
        CompoundButton view = getView(viewId);
        view.setOnCheckedChangeListener(listener);
    }

    public void addTextChangedListener(int viewId, TextWatcher textWatcher) {
        TextView view = getView(viewId);
        view.addTextChangedListener(textWatcher);
    }

}
2. 自定义适配 BaseAdapter
public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {

    public static final int TYPE_HEADER = 10000;
    public static final int TYPE_ITEM = 20000;
    private Context context;
    private List<T> datas;
    private LayoutInflater inflater;
    private int mLayoutId;
    private OnItemClickListener<T> onItemClickListener;
    private final View header;

    /**
     * 不带头部的构造方法
     *
     * @param context
     * @param datas
     * @param layoutId
     */
    public BaseAdapter(Context context, List<T> datas, int layoutId) {
        this(context, datas, null, layoutId);
    }

    /**
     * 带头部的构造方法
     *
     * @param context
     * @param datas
     * @param header
     * @param layoutId
     */
    public BaseAdapter(Context context, List<T> datas, View header, int layoutId) {
        this.context = context;
        this.datas = datas;
        this.header = header;
        mLayoutId = layoutId;
        inflater = LayoutInflater.from(context);
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_HEADER) {
            return new BaseViewHolder(header);
        } else {
            View itemView = inflater.inflate(mLayoutId, parent, false);
            return new BaseViewHolder(itemView);
        }
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        if (header != null) {
            if (position > 0) {
                convert(holder, datas.get(position - 1), position - 1);
                setListener(holder, position - 1);
            }
        } else {
            convert(holder, datas.get(position), position);
            setListener(holder, position);
        }

    }

    public Context getContext() {
        return context;
    }

    public List<T> getDatas() {
        return datas;
    }

    public LayoutInflater getInflater() {
        return inflater;
    }

    public View getHeader() {
        return header;
    }

    private void setListener(BaseViewHolder holder, final int position) {
        if (onItemClickListener != null) {
            holder.itemView.setOnClickListener(new NoDoubleClickListener() {
                @Override
                public void onNoDoubleClick(View v) {
                    onItemClickListener.onItemClick(v, position, datas.get(position));
                }
            });
        }

    }

    public boolean isHeaderView(int position) {
        return header != null && position == 0;
    }

    /**
     * 绑定数据的方法
     *
     * @param holder
     * @param t
     * @param position
     */
    public abstract void convert(BaseViewHolder holder, T t, int position);

    @Override
    public int getItemViewType(int position) {
        if (header != null && position == 0) {
            return TYPE_HEADER;
        } else {
            return TYPE_ITEM;
        }

    }

    @Override
    public int getItemCount() {
        int size;
        if (datas != null) {
            size = datas.size();
        } else {
            size = 0;
        }
        if (header != null) {
            return size + 1;
        } else {
            return size;
        }
    }

    /**
     * 获取Item数据
     *
     * @param position
     * @return
     */
    public T getItem(int position) {
        return datas.get(position);
    }

    /**
     * 设置新的数据源
     *
     * @param datas
     */
    public void setDatas(List<T> datas) {
        this.datas.clear();
        this.datas.addAll(datas);
        notifyDataSetChanged();
    }

    /**
     * 添加一条数据
     *
     * @param data
     */
    public void addData(T data) {
        datas.add(data);
        notifyDataSetChanged();
    }

    /**
     * 根据索引添加一条数据
     *
     * @param index
     * @param data
     */
    public void addData(int index, T data) {
        datas.add(index, data);
        notifyDataSetChanged();
    }

    /**
     * 清空列表数据
     */
    public void clearData() {
        datas.clear();
        notifyDataSetChanged();
    }

    public interface OnItemClickListener<T> {
        void onItemClick(View view, int position, T t);
    }

    public interface OnLongClickListener<T> {
        void onLongClick(View view, int position, T t);
    }
}
3. 定义布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/ll_item_Tasks"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/layout_bg_style_one"
                android:orientation="vertical">

    <CheckBox
        android:id="@+id/cb_item_noTask"
        style="@android:style/Widget.CompoundButton.CheckBox"
        android:layout_width="match_parent"
        android:layout_height="@dimen/y70"
        android:layout_marginLeft="@dimen/x20"
        android:button="@drawable/checkbox_style_dot"
        android:checked="false"
        android:gravity="center_vertical"
        android:paddingLeft="@dimen/x30"
        android:textColor="@color/primaryDark"
        android:textSize="@dimen/FontSize_24"/>


</RelativeLayout>
4. 自定义适配器 NewSealCarTasksAdapter
public class NewSealCarTasksAdapter extends BaseAdapter<VehicleTaskBean> {
    private TaskSelectAdapter.CallBack callBack;

    public NewSealCarTasksAdapter(Context context, List<VehicleTaskBean> datas) {
        super(context, datas, R.layout.adapter_item_new_seal_car);
    }

    @Override
    public void convert(BaseViewHolder holder, VehicleTaskBean vehicleTaskBean, int position) {
        String plateNum = vehicleTaskBean.getPlateNum();
        String lineCode = vehicleTaskBean.getLineCode();
        if (isNotNull(plateNum)) {
            plateNum = "";
        }
        if (isNotNull(lineCode)) {
            lineCode = "";
        }
        String string = vehicleTaskBean.getSendCarTm() + "\u3000" + plateNum + "\n\u3000\u3000\u3000\u3000" + "\u3000\u3000" + lineCode;
        holder.setText(R.id.cb_item_noTask, string);

        holder.setOnCheckedChangeListener(R.id.cb_item_noTask, null);
        holder.setChecked(R.id.cb_item_noTask, vehicleTaskBean.isChecked());
        holder.setOnCheckedChangeListener(R.id.cb_item_noTask, (compoundButton, b) -> {
            vehicleTaskBean.setChecked(b);
            List<VehicleTaskBean> datas = getDatas();
            for (int i = 0; i < datas.size(); i++) {
                datas.get(i).setChecked(false);
            }
            datas.get(position).setChecked(b);
            notifyDataSetChanged();
            if (callBack != null) {
                callBack.callBack(position, b);
            }
        });
    }

    public boolean isNotNull(String text) {
        return StringUtils.isEmpty(text) || "null".equals(text);
    }

    public interface CallBack {
        void callBack(int position, boolean enable);
    }

    public void setCallBack(TaskSelectAdapter.CallBack callBack) {
        this.callBack = callBack;
    }

}
5. 添加数据

protected void initData() {
  vehicleList = new ArrayList<>();
        adapter = new NewSealCarTasksAdapter(getActivity(), vehicleList);
        recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(adapter);
        }


@Override
    protected void initListener() {
         adapter.setCallBack((position, enable) -> {
            cbNoTask.setChecked(false);
            btnNext.setEnabled(enable);
            vehicleNo = vehicleList.get(position).getPlateNum();
            taskId = vehicleList.get(position).getTaskId();
            requireId = vehicleList.get(position).getRequireId();
        });

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值