实现效果:
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();
});
}