Android--recycleview子item中checkbox+edittext遇到的问题

在Android的RecyclerView中,当子项包含Checkbox和EditText时,由于复用机制可能导致选择状态同步错误和文本自动填充问题。为避免这个问题,可以尝试禁用复用项或者使用setTag方法进行状态保存。对于EditText,可以通过监听其变化来捕获并处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、由于recycleview复用机制,checkbox选一个,下面自动选中,edittext自动输入问题:

@Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        //禁止复用,要不数据重复
        viewHolder.setIsRecyclable(false);
        viewHolder.ckPeoplewater.setText(chargeList.get(position).getItem_Name());
        viewHolder.tvPeopleprice.setText(chargeList.get(position).getItem_Price()+"");
        viewHolder.tvPeopleprice1.setText(chargeList.get(position).getSewageFee()+"");
        viewHolder.tvPeopleprice2.setText(chargeList.get(position).getResourceFee()+"");
        viewHolder.etPeoplewater.setText(chargeList.get(position).getItemHighLimit()+"");
        viewHolder.etPeoplewater1.setText(chargeList.get(position).getItemLowLimit()+"");
        chargeList.get(position).setItemHighLimit(Integer.parseInt(viewHolder.etPeoplewater.getText().toString()));

        viewHolder.ckPeoplewater.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked == true) {
                    map.put(position, true);

                    TextWatcher watcher = new TextWatcher() {
                        @Override
                        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){

                        }
                        @Override
                        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                        }
                        @Override
                        public void afterTextChanged(Editable editable) {
                            if (!TextUtils.isEmpty(editable.toString())){
                                chargeList.get(position).setItemHighLimit(Integer.parseInt(editable.toString()));
                            }
                            if(editable != null){
                                mOnItemClickListener.onEtRateClick(position,editable.toString());
                            }
                        }
                    };
                    viewHolder.etPeoplewater.addTextChangedListener(watcher);

                    TextWatcher watcher1 = new TextWatcher() {
                        @Override
                        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){

                        }
                        @Override
                        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                        }
                        @Override
                        public void afterTextChanged(Editable editable) {
                            if (!TextUtils.isEmpty(editable.toString())){
                                chargeList.get(position).setItemLowLimit(Integer.parseInt(editable.toString()));
                            }
                            if(editable != null){
                                mOnItemClickListener.onEtTotalClick(position,editable.toString());
                            }
                        }
                    };
                    viewHolder.etPeoplewater1.addTextChangedListener(watcher1);

                } else {
                    map.remove(position);
                }

                if (mOnItemClickListener!=null){
                    mOnItemClickListener.onItemClick(position,chargeList,isChecked);
                }
            }
        });
        if (map != null && map.containsKey(position)) {
            viewHolder.ckPeoplewater.setChecked(true);
        } else {
            viewHolder.ckPeoplewater.setChecked(false);
        }


    }

我这个数据少,可以禁用,数据多的回卡顿,通过设置settag来实现,百度有好多;

对edittext监听,获取数据:

public class chargeAdapter extends RecyclerView.Adapter<chargeAdapter.ViewHolder> {

    private Context mContext;
    List<watercharge .ItemsInfoBean> chargeList;
    private OnItemClickListener mOnItemClickListener;
    private Map<Integer, Boolean> map = new HashMap<>();

    public chargeAdapter(Context context,List<watercharge .ItemsInfoBean> chargeList) {
        this.mContext = context;
        this.chargeList = chargeList;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_charge, viewGroup, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        //禁止复用,要不数据重复
        viewHolder.setIsRecyclable(false);
        viewHolder.ckPeoplewater.setText(chargeList.get(position).getItem_Name());
        viewHolder.tvPeopleprice.setText(chargeList.get(position).getItem_Price()+"");
        viewHolder.tvPeopleprice1.setText(chargeList.get(position).getSewageFee()+"");
        viewHolder.tvPeopleprice2.setText(chargeList.get(position).getResourceFee()+"");
        viewHolder.etPeoplewater.setText(chargeList.get(position).getItemHighLimit()+"");
        viewHolder.etPeoplewater1.setText(chargeList.get(position).getItemLowLimit()+"");
        chargeList.get(position).setItemHighLimit(Integer.parseInt(viewHolder.etPeoplewater.getText().toString()));

        viewHolder.ckPeoplewater.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked == true) {
                    map.put(position, true);

                    TextWatcher watcher = new TextWatcher() {
                        @Override
                        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){

                        }
                        @Override
                        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                        }
                        @Override
                        public void afterTextChanged(Editable editable) {
                            if (!TextUtils.isEmpty(editable.toString())){
                                chargeList.get(position).setItemHighLimit(Integer.parseInt(editable.toString()));
                            }
                            if(editable != null){
                                mOnItemClickListener.onEtRateClick(position,editable.toString());
                            }
                        }
                    };
                    viewHolder.etPeoplewater.addTextChangedListener(watcher);

                    TextWatcher watcher1 = new TextWatcher() {
                        @Override
                        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){

                        }
                        @Override
                        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                        }
                        @Override
            
内容概要:本文档详细介绍了基于MATLAB实现多目标差分进化(MODE)算法进行无人机三维路径规划的项目实例。项目旨在提升无人机在复杂三维环境中路径规划的精度、实时性、多目标协调处理能力、障碍物避让能力和路径平滑性。通过引入多目标差分进化算法,项目解决了传统路径规划算法在动态环境和多目标优化中的不足,实现了路径长度、飞行安全距离、能耗等多个目标的协调优化。文档涵盖了环境建模、路径编码、多目标优化策略、障碍物检测与避让、路径平滑处理等关键技术模块,并提供了部分MATLAB代码示例。 适合人群:具备一定编程基础,对无人机路径规划和多目标优化算法感兴趣的科研人员、工程师和研究生。 使用场景及目标:①适用于无人机在军事侦察、环境监测、灾害救援、物流运输、城市管理等领域的三维路径规划;②通过多目标差分进化算法,优化路径长度、飞行安全距离、能耗等多目标,提升无人机任务执行效率和安全性;③解决动态环境变化、实时路径调整和复杂障碍物避让等问题。 其他说明:项目采用模块化设计,便于集成不同的优化目标和动态环境因素,支持后续算法升级与功能扩展。通过系统实现和仿真实验验证,项目不仅提升了理论研究的实用价值,还为无人机智能自主飞行提供了技术基础。文档提供了详细的代码示例,有助于读者深入理解和实践该项目。
Android中,利用CheckboxRecyclerView实现一个多选功能的案例通常涉及以下几个步骤: 1. **布局设计**:首先,在XML布局文件中,为每个item创建一个包含CheckBox的ViewHolder。例如: ```xml <data> <variable name="item" type="YourDataClass" /> </data> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:padding="8dp"> <!-- 其他视图如文字 --> <CheckBox android:id="@+id/checkBox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="@={item.isChecked}"/> <!-- 更多视图... --> </LinearLayout> </androidx.recyclerview.widget.RecyclerView> ``` 2. **ViewHolder和Adapter**:创建一个自定义的ViewHolder,并在Adapter中绑定数据。当item中的Checkbox状态改变时,更新相应的model属性(如`isChecked`)并通知adapter。 ```java class ItemViewHolder extends RecyclerView.ViewHolder { private CheckBox checkBox; // 构造函数和绑定事件... public void onBindViewHolder(YourDataClass item, int position) { checkBox.setChecked(item.isChecked); checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { YourDataClass data = (YourDataClass) getItemAtPosition(position); data.setChecked(isChecked); // 更新数据模型 notifyItemChanged(position); // 通知adapter更新 } }); } } // Adapter的相应部分... ``` 3. **添加和管理选择状态**:在Activity或Fragment中,你可以通过遍历adapter的items来获取所有选中的项,或者提供一个方法供用户直接操作整个选择集。 ```java private List<YourDataClass> selectedItems; public void selectAllItems() { for (YourDataClass item : adapter.getItems()) { item.setChecked(true); } } // 获取选中的item列表 List<YourDataClass> getSelectedItems() { List<YourDataClass> result = new ArrayList<>(); for (int i = 0; i < adapter.getItemCount(); i++) { if (adapter.getItem(i).isChecked()) { result.add(adapter.getItem(i)); } } return result; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值