Memory_bellwether 2019-12-20 22:29 采纳率: 0%
浏览 695

初始化复选框选中状态会触发本身的OnCheckedChange事件?

各位大佬,请教一下。我在Adapter的getview 方法中 根据获取的值来**初始化复选框**的**选中状态**,然后**这个初始化操作就触发了复选框的onCheckedchange事件**,事件中有刷新数据的功能,然后就进入了死循环。这怎么处理啊 环境:Android studio 3.5.4

下面是初始化操作,在getview 方法中的

BmobQuery<Cai> query_state_cai=new BmobQuery<>();
        query_state_cai.addWhereEqualTo("tieZiId",tieziId).addWhereEqualTo("people",userId);
        query_state_cai.findObjects(new FindListener<Cai>() {
            @Override
            public void done(List<Cai> list, BmobException e) {
                if(e==null){
                    if(list.size()>0){
                        viewHolder.check_cai.setChecked(true);
                    }else {
                        viewHolder.check_cai.setChecked(false);
                    }
                }else {
                    Log.d("print","初始化点赞状态出错:"+e.getMessage());
                }
            }
        });

下面是复选框的事件

 @Override
    public void OnCheckChange_Cai(CompoundButton viewButton) {
        String tieziId=viewButton.getTag().toString();
        String userId;
        MyApplication myApplication=new MyApplication();

            //如果用户已登录
            if(myApplication.getLoginUser()!=null){
            userId= myApplication.getLoginUser().getUserId();

            if(viewButton.isChecked()){
                        //如果单选框被选中,执行操作
                delete_zanInfo(tieziId,userId);//删除点赞的记录
                saveCAI(tieziId,userId);//添加踩的记录
            }else {
                        //如果没选中
                delete_caiInfo(tieziId,userId);//删除踩的记录
            }
            initDatas();//重新获取ListView的数据
        }else{
            Toast.makeText(mContext,"请登录后再操作",Toast.LENGTH_SHORT).show();

        }
    }
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-28 11:18
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的代码中,你正在尝试将复选框的状态设置为truefalse时,但是实际上你在处理的是一个监听器(OnCheckedChangeListener),而不是一个复选框的监听器。

    你应该首先检查复选框是否已经被点击过,然后根据复选框的状态更新数据库中的数据。你可以使用setSelected()方法来改变复选框的状态:

    public class CaiViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
        private CompoundButton check_cai;
    
        public CaiViewHolder(View itemView) {
            super(itemView);
    
            check_cai = (CompoundButton)itemView.findViewById(R.id.check_cai);
    
            check_cai.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            int position = getAdapterPosition();
    
            if (position != RecyclerView.NO_POSITION) {
                // 获取当前选中的复选框的位置
                boolean isChecked = check_cai.isSelected();
    
                // 更新数据库中的数据
                updateDB(isChecked);
            }
        }
    
        private void updateDB(boolean isChecked) {
            // 在这里处理数据库更新逻辑
        }
    }
    

    这样,当用户点击复选框时,它就会调用updateDB()方法并传递给它一个布尔值表示复选框的状态。如果你希望复选框的状态变化能够立即反映到列表中,那么你需要重写getAdapterPosition()方法,并确保它返回正确的位置索引。例如:

    private int getAdapterPosition() {
        return ((CaiViewHolder) itemView).check_cai.getCheckedState() == 1 ? 0 : -1; // 如果是未选择的状态,返回-1;如果是选择了的状态,返回0
    }
    

    最后,记得在适配器的onBindViewHolder()方法中注册复选框的监听器:

    adapter.registerViewHolder(CaiViewHolder.class, R.layout.item_cai);
    

    现在,当你点击复选框时,它的状态会被正确地更新到数据库,并且列表也会相应地更新。

    评论

报告相同问题?