以编程方式切换复选框
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 和复选框的颜色