以编程方式切换复选框

Posted

技术标签:

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

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

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

谢谢!

【问题讨论】:

【参考方案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_
    android:layout_
    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) 

【讨论】:

以上是关于以编程方式切换复选框的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式检查复选框

Android:以编程方式更改 RadioButtons 和复选框的颜色

Magento 与 Mailchimp -----以编程方式添加复选框

在 reactjs 中以编程方式取消选中复选框

使用Cocoa以编程方式创建复选框

使用 Cocoa 在 Swift 4.0 中以编程方式创建复选框的标准方法是啥?