【问题标题】:Toggle checkbox programmatically以编程方式切换复选框
【发布时间】:2011-12-25 01:38:29
【问题描述】:

我有一个列表视图,其中包含需要可检查/不可检查的项目。我已经设置了一个当前使用 android.R.layout.simple_list_item_multiple_choice 作为行的 ArrayAdapter,并且一切都显示得很好。我也能够正确获得对该项目的点击。但是,当项目被选中时,UI 中的复选框不会切换。我一直在尝试解决这个问题,有人能指出我正确的方向吗?我只想知道如何强制 UI 更新以反映复选框的更改状态。

如果需要,我可以提供代码,但我想在这里寻找一些非常具体的东西,所以我认为发布一堆我的代码不会有太大帮助。

谢谢!

【问题讨论】:

    标签: android listview android-arrayadapter


    【解决方案1】:

    在java代码中以编程方式

    CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkBox);
    
    mCheckBox.setChecked(true); //to check
    mCheckBox.setChecked(false); //to uncheck
    

    在安卓 XML 中

    android:checked="true" //to check
    android:checked="false" //to uncheck
    

    作为

    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="Checkbox Item" />
    

    【讨论】:

      【解决方案2】:

      首先通过我的这个答案:Android listview with check boxes?

      很好,因为您想在 ListView 中实现选中/未选中的复选框,您只需要在 getView() 方法中实现以下几行:

       // also check this lines in the above example
      ViewHolder holder = (ViewHolder) view.getTag();
      holder.checkbox.setChecked(list.get(position).isSelected());
      

      还要检查 getView() 方法以在 ListView 内的 CheckBox 上执行事件:

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          View view = null;
          if (convertView == null) {
              LayoutInflater inflator = context.getLayoutInflater();
              view = inflator.inflate(R.layout.rowbuttonlayout, null);
              final ViewHolder viewHolder = new ViewHolder();
              viewHolder.text = (TextView) view.findViewById(R.id.label);
              viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
              viewHolder.checkbox
                  .setOnCheckedChangeListener(
                      new CompoundButton.OnCheckedChangeListener() {
      
                      @Override
                      public void onCheckedChanged(CompoundButton buttonView,
                              boolean isChecked) {
                          Model element = (Model) viewHolder.checkbox
                                  .getTag();
                          element.setSelected(buttonView.isChecked());
                      }
                  });
              view.setTag(viewHolder);
              viewHolder.checkbox.setTag(list.get(position));
          } else {
              view = convertView;
              ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
          }
          ViewHolder holder = (ViewHolder) view.getTag();
          holder.text.setText(list.get(position).getName());
          holder.checkbox.setChecked(list.get(position).isSelected());
          // ......  
      }
      

      【讨论】:

      • +1 我是你的追随者,你能告诉我该怎么做(阅读/观看)以了解更多关于 android 的信息吗?!谢谢..从您的回答中学到了很多东西。
      • 感谢您的客气话。我一直在尝试学习一个主题一天并做 SO 和我的博客。学习新主题还需要什么:),你来自哪里?
      • 印度,我也来做这件事,找到至少一个我不知道的话题并得到关于那个的问题和答案..但有时我还是厌倦了这样做..但是你们一直在鼓励我。
      • 感谢您的回复!所以你是说基础 ListView 类和基础 ArrayAdapter 都不能用于使复选框起作用?
      • ArrayAdapter 也可以工作,查看这个例子vogella.de/articles/AndroidListView/article.html
      【解决方案3】:

      您是否尝试过以下方法?

      @Override
      public void onListItemClick(ListView listView, View view, int position, long id) {
      
          //Invert the checkbox-status        
          ((CheckedTextView) view.findViewById(R.id.text1)).setChecked(!isChecked());
      
          return;
      
      }   
      

      【讨论】:

      • 列表中的项目是动态的——每个行项目没有唯一的 XML ID。除非我理解错了?但我还是试了一下,得到了 NullPointerException :(
      • 无论如何,你不需要这样做,你可以这样做checkbox.toggle() ;)
      【解决方案4】:

      您可以使用自定义基础适配器。这将允许您一次只选择一个,但您可以通过撤消检查以查看哪些被选中来更改此设置。

      public class CheckBoxGridAdapter extends BaseAdapter{
      
          LayoutInflater inflater;
          ArrayList<Holder> list;
          int res;
          Context context;
      
          public CheckBoxGridAdapter(Context context, ArrayList<Holder> list, int layoutResourceId) {
              inflater = LayoutInflater.from(context);
              this.context = context;
              this.list =list;
              this.res = layoutResourceId;
          }
      
          @Override
          public int getCount() {
              return list.size();
          }
      
          @Override
          public Object getItem(int position) {
              return position;
          }
      
          @Override
          public long getItemId(int position) {
              return position;
          }
      
          public View getView(final int position, View convertView, ViewGroup parent) { 
              final ViewHolder holder; 
              if (convertView == null) { 
                  convertView = inflater.inflate(res, 
                          parent, false);
                  holder = new ViewHolder(); 
                  holder.tv1 = (TextView) convertView.findViewById(R.id.checkBoxTxt); 
                  holder.cb = (CheckBox) convertView.findViewById(R.id.checkBox); 
                 convertView.setTag(holder); 
             } else { 
                 holder = (ViewHolder) convertView.getTag(); 
             } 
             Holder h = list.get(position);
             holder.tv1.setText(h.getCBName());
             holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      
                 @Override
                 public void onCheckedChanged(CompoundButton buttonView,
                         boolean isChecked) {
                     if(isChecked)
                     {
                          int pos = (Integer) buttonView.getTag();
                          checkChecks(pos);               
                     }
                     CheckBoxGridAdapter.this.notifyDataSetChanged();
                 }
             });
             holder.cb.setTag(position);
             holder.cb.setChecked(list.get(position).getSelectState());
             return convertView; 
          }
      
          protected void checkChecks(int pos) {
                  for(int i = 0;i<list.size();i++)
                  {
                      Holder h = (Holder) list.get(i);
                      if(i==pos)
                      {
                        Log.d( pos +" checked","is checked");
                        h.setSelectState(true);
                      }
                      else
                      {
                           Log.d( i +" checked","is  not checked");
                           h.setSelectState(false);
                      }
                  }
          }
      
          static class ViewHolder
          {
              TextView tv1;
              CheckBox cb;
              RadioButton rb;
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        您可以通过这样做来切换复选框:

        checkbox.setChecked(!checkbox.isChecked());
        

        其中的复选框是您的“复选框”元素。

        【讨论】:

          【解决方案6】:

          在 kotlin 中,以编程方式将复选框设置为未选中

          binding.imageCheckBox.post { binding.imageCheckBox.setChecked(false) }
          

          并以编程方式选中复选框

          binding.imageCheckBox.post { binding.imageCheckBox.setChecked(true) }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-07
            • 1970-01-01
            相关资源
            最近更新 更多