安卓有个常见需求:进入下个列表页面勾选几个选项,就是实现列表复选功能。本文实现RecyclerView复选功能。
MainActivity代码:对数据进行处理
public class MainActivity extends superActivity implements CheckListAdapter.CheckItemListener {
// 列表
@BindView(R.id.rv_do_task)
RecyclerView rv_do_task;
//适配器
private CheckListAdapter mCheckListAdapter;
//选中后的数据
private List<DoTaskBean> checkedList = new ArrayList<>();
//列表数据
List<DoTaskBean> doTaskBeans = new ArrayList<>();
@Override
public int getContentViewId() {
return R.layout.activity_do_task_worker;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initData();
}
// 初始化布局
private void initView() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
rv_do_task.setLayoutManager(linearLayoutManager);
}
// 初始化数据
private void initData() {
doTaskBeans = result.getData();
// 网络访问成功:数据加载
mCheckListAdapter = new CheckListAdapter(MainActivity.this, doTaskBeans, DoTaskWorkerActivity.this);
rv_do_task.setAdapter(mCheckListAdapter);
}
@Override
public void itemChecked(DoTaskBean doTaskBean, boolean isChecked) {
//处理Item点击选中回调事件
if (isChecked) {
//选中处理
if (!checkedList.contains(doTaskBean)) {
checkedList.add(doTaskBean);
}
} else {
//未选中处理
for (int i = 0; i < checkedList.size(); i++) {
if (checkedList.get(i).getEmpId().equals(doTaskBean.getEmpId())) {
checkedList.remove(i);
}
}
}
}
}
列表布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_do_task"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
基础类:
public class DoTaskBean implements Serializable {
private String empId;
private String headImage;
// 是否选中
private boolean isChecked;
public void setEmpId(String empId) {
this.empId = empId;
}
public String getEmpId() {
return empId;
}
public void setHeadImage(String headImage) {
this.headImage = headImage;
}
public String getHeadImage() {
return headImage;
}
public boolean isChecked() {
return isChecked;
}
public void setChecked(boolean checked) {
isChecked = checked;
}
}
自定义适配器Adapter:
public class CheckListAdapter extends RecyclerView.Adapter<CheckListAdapter.ViewHolder> {
private Context mContext;
private List<DoTaskBean> mDatas;
private CheckItemListener mCheckListener;
private boolean[] flag = new boolean[100];
public CheckListAdapter(Context mContext, List<DoTaskBean> mDatas, CheckItemListener mCheckListener) {
this.mContext = mContext;
this.mDatas = mDatas;
this.mCheckListener = mCheckListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_do_task_worker_list, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
// holder.setIsRecyclable(false);
final DoTaskBean bean = mDatas.get(position);
if (!TextUtils.isEmpty(bean.getHeadImage())) {
String url = bean.getHeadImage();
Uri imageUri = Uri.parse(url);
if (null == holder || null == imageUri || imageUri.equals("")) {
return;
}
// 加载已经存储的imageUrl地址图片
Glide.with(mContext)
.load(imageUri)
.placeholder(R.drawable.icon_set_default)
.error(R.drawable.icon_set_default)
.override(39, 39)
.bitmapTransform(new CropCircleTransformation(mContext)) //进行圆角处理
.into(holder.item_worker_head);
}
holder.item_cb.setOnCheckedChangeListener(null);
holder.item_cb.setClickable(false);
holder.item_content_ll.setOnClickListener(null);
holder.item_cb.setTag(position);
// 初始化一下选择按钮
flag[position] = bean.isChecked();
holder.item_cb.setChecked(flag[position]);
// 点击实现选择功能,当然可以把点击事件放在item_cb对应的CheckBox上,只是焦点范围较小
holder.item_content_ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//保存position信息
flag[position] = !mDatas.get(position).isChecked();
mDatas.get(position).setChecked(!mDatas.get(position).isChecked());
if (null != mCheckListener) {
mCheckListener.itemChecked(mDatas.get(position), mDatas.get(position).isChecked());
}
// 刷新数据
notifyDataSetChanged();
}
});
}
@Override
public void onViewRecycled(ViewHolder holder) {
super.onViewRecycled(holder);
if (holder != null) {
Glide.clear(holder.item_worker_head);
}
super.onViewRecycled(holder);
}
@Override
public int getItemCount() {
return mDatas.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
// 头像
private ImageView item_worker_head;
// 选择
private CheckBox item_cb;
// 整个条目
private LinearLayout item_content_ll;
public ViewHolder(View itemView) {
super(itemView);
item_worker_head = (ImageView) itemView.findViewById(R.id.item_worker_head);
item_cb = (CheckBox) itemView.findViewById(R.id.item_cb);
item_content_ll = (LinearLayout) itemView.findViewById(R.id.item_content_ll);
}
}
public interface CheckItemListener {
void itemChecked(DoTaskBean doTaskBean, boolean isChecked);
}
}
item布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/item_content_ll"
android:layout_width="match_parent"
android:layout_height="81dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/item_worker_head"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="15dp"
android:gravity="center"
android:src="@drawable/icon_set_default"
android:background="@drawable/img_bg_head"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="14dp">
<CheckBox
android:id="@+id/item_cb"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_centerVertical="true"
android:button="@null"
android:layout_alignParentEnd="true"
android:layout_marginRight="15dp"
android:background="@drawable/task_cb_selector"/>
</RelativeLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginLeft="63dp"
android:layout_marginRight="5dp"
android:background="#bcbcbc"/>
</LinearLayout>
注:拿到已经选择的item数据,选择item时容易出现列表错乱。
这里添加了一个flag 记录是否已经选择了item,并且禁止了checkbox的点击事件。
holder.item_cb.setClickable(false);
如果,进入此页面需要数据,再进行判断设置数据的isChecked,根据数据源改变列表视图。
Glide加载头像图片错乱解决方式:
@Override
public void onViewRecycled(ViewHolder holder) {
super.onViewRecycled(holder);
if (holder != null) {
Glide.clear(holder.item_worker_head);
}
super.onViewRecycled(holder);
}