代码之家  ›  专栏  ›  技术社区  ›  A.Agaty

使用setOnCheckedChangeListener的复选框保持器

  •  3
  • A.Agaty  · 技术社区  · 10 年前

    我正在尝试用复选框创建一个列表视图,我尝试了一个代码,它工作正常,但在尝试处理复选框状态时遇到了一个问题。问题出现在这行代码中

    holder.chkBox.setOnCheckedChangeListener((MyActivity) context);

    因为我尝试的代码使用的是Adapter。与MainActivity分离的java文件。java文件,但在我的代码中,所有代码都在一个文件中,所以我不知道如何在代码中使用这一行,我已经尝试过了

    holder.chkBox.setOnCheckedChangeListener((this) context);

    但也是一个错误的说法

    使用这行holder的原因是,当我选中一个复选框并向下滚动其他项目时,选中的复选框会自动取消选中。有人能告诉我如何解决这个问题吗?

    这是我的适配器代码

    @Override public View getView(final int position, View convertView, ViewGroup parent) {
             ViewHolder holder=null;
            View itemView = convertView;
            if (itemView == null){
                LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                itemView = inflater.inflate(R.layout.item, null);
                holder = new ViewHolder();
                holder.textView1  = (TextView) itemView.findViewById(R.id.textView1);
                holder.check1 = (CheckBox) itemView.findViewById(R.id.check1);
                holder.check2 = (CheckBox) itemView.findViewById(R.id.check2);
                itemView.setTag(holder);
           }
            else{
                holder = (ViewHolder) itemView.getTag();
            }
            holder.check1.setTag(position);
            final Item item = items.get(position);
            holder.textView1.setText(item.getName());
            holder.check1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
                                                         @Override
                                                         public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                                                             if(buttonView.isPressed()){
    
                                                             if (position != ListView.INVALID_POSITION) {
                                                                 Item p = items.get(position);
                                                                 p.setSelected(isChecked);
                                                             }
    
                                                             }
                                                         }
                                                     }
            );
    holder.check2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
                                                         @Override
                                                         public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
                                                             if(buttonView.isPressed()){
                                                                                   if (position != ListView.INVALID_POSITION) {
                                                                     Item p = items.get(position);
                                                                     p.setSelected(isChecked);
                                                                 }
    
                                                             }
                                                         }
                                                     }
            );
            holder.check1.setChecked(item.isSelected());
            holder.check2.setChecked(item.isSelected());
            return itemView;
        }
    }private static class ViewHolder {
        public TextView textView1;
       public CheckBox  check2,check1;
    }}
    
    2 回复  |  直到 10 年前
        1
  •  0
  •   Farhad    10 年前

    OnCheckedChangedListener 接口,它强制实现以下方法:

            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
    
            }
    

    现在将活动的引用作为OnCheckedChangeListener类型的参数传递给适配器,并将其命名为listener:

    MyAdapter myadapter = new MyAdapter(context, MyActivity.this,listdata);
    

    然后,在适配器类中,为复选框设置侦听器,如:

    holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
       @Override
       public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
    
    
                if(buttonView.isPressed()){
                //Write the logic to determine if the checkbox must be checked or not                
                    }
              }
          }
        ); 
    

    这里的重点是 使用 按下()

        2
  •  0
  •   Karen Forde    10 年前

    在您使用的示例代码中,您的活动实现了OnCheckedChangeListener,因此您需要传递上下文。在适配器中,可以执行以下操作:

    holder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    
           @Override
           public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
               // logic
           }
       }
    );  
    

    在您使用它的代码中,您的活动中可能有一个重写的onCheckedChanged方法。把逻辑移到上面我有//逻辑的地方。