Android之RecyclerView列表多选

安卓有个常见需求:进入下个列表页面勾选几个选项,就是实现列表复选功能。本文实现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);
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值