Android RecyclerView优雅的实现列表单选功能

1.前言

 1.现在有一个简单的需求,需要实现列表单选功能,如何实现尼?首先我大概说下我实现的思路,首先在Bean(实体类)里面声明一个boolean 值,根据这个boolean值去改变RadioButton的是否选中状态,同时在Activity或者Fragment里面 声明一个变量id和当前下标去做对比。下面看下要实现的效果图!

2.效果图
如下图所示

3.代码实现步骤:

 private CommonAdapter<SelectAddressModel.ReturnDataBean> mAdapter;
 private List<SelectAddressModel.ReturnDataBean> mDataList = new ArrayList<>();
 //private int posIndex;//记录当前下标
 private int mSelectedPos = -1;//实现单选 变量保存当前选中的position
 /*
 * 获取个人地址,这就是用Retrofit请求框架去获取数据,用法就不多讲了isState就是SelectAddressModel 实体类里面声明的一个boolean值
 * */
 public void getAddressData(String id) {
        Api.getApi2().getLoadMemberAddressData(id)
                .compose(callbackOnIOToMainThread())
                .subscribe(new BaseNetSubscriber<SelectAddressModel>() {
                    @Override
                    public void onNext(SelectAddressModel baseBean) {
                        super.onNext(baseBean);
                        if (baseBean.getReturnData().size() > 0) {
                            mDataList.addAll(baseBean.getReturnData());
                            mDataList.get(0).setState(true);
                        }
                        for (int i = 0; i < mDataList.size(); i++) {
                            if (mDataList.get(i).isState()) {
                                mSelectedPos = i;
                            }
                        }
                        mAdapter = new CommonAdapter<SelectAddressModel.ReturnDataBean>(aty, R.layout.layout_select_address, mDataList) {
                            @Override
                            protected void convert(ViewHolder holder, SelectAddressModel.ReturnDataBean item, int position) {
                                LinearLayout linAddress = holder.getView(R.id.linAddress);
                                RadioButton rad_balance = holder.getView(R.id.rad_balance);
                                RadioGroup radioGroup = holder.getView(R.id.rad_address);
                                rad_balance.setText(item.getS_weizhiFull());
                                if (!item.isState()) {
                                    linAddress.setBackgroundColor(getResources().getColor(R.color.colorWhite));
                                    rad_balance.setChecked(false);
                                } else {
                                    linAddress.setBackgroundColor(getResources().getColor(R.color.address_bg));
                                    rad_balance.setChecked(true);
                                }
                                rad_balance.setOnClickListener(v -> {

                                    //实现单选方方法: 设置数据集时,找到默认选中的pos
                                    if (mSelectedPos != position) {
                                        //先取消上个item的勾选状态
                                        mDataList.get(mSelectedPos).setState(false);
                                        linAddress.setBackgroundColor(getResources().getColor(R.color.colorWhite));
                                        rad_balance.setChecked(false);
                                        notifyItemChanged(mSelectedPos);
                                        //设置新Item的勾选状态
                                        mSelectedPos = position;
                                        mDataList.get(mSelectedPos).setState(true);
                                        linAddress.setBackgroundColor(getResources().getColor(R.color.address_bg));
                                        rad_balance.setChecked(true);
                                        notifyItemChanged(mSelectedPos);
                                    }
                                });
                            }
                        };
                        mBinding.recycviewAddress.setLayoutManager(new LinearLayoutManager(aty));
                        mBinding.recycviewAddress.setAdapter(mAdapter);
                    }

                    @Override
                    public void onError(Throwable e) {
                        super.onError(e);

                    }
                });
    }

4.注意要点:
要实现单选功能以上代码就ok了,上面代码也有注释,相信你们都能看懂!这里要说一点 就是当你设置或者取消Item的勾选状态时候,一定要记得notifyItemChanged去更新当前的下标,其实实现列表单选有很多方法,不止这一种,要是写的不好的地方勿喷!谢谢,好啦 代码就分析到这里,有啥问题 欢迎留言。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值