Android 复选框';使用“performClick”时,未正确显示的状态
我遇到了一个棘手的问题: 在我的应用程序中,有一个列表(使用列表视图),每个项目都包含文本和与右侧对齐的复选框。 现在,单击复选框本身就可以了,我为它安装了一个处理程序(Android 复选框';使用“performClick”时,未正确显示的状态,android,listview,checkbox,Android,Listview,Checkbox,我遇到了一个棘手的问题: 在我的应用程序中,有一个列表(使用列表视图),每个项目都包含文本和与右侧对齐的复选框。 现在,单击复选框本身就可以了,我为它安装了一个处理程序(OnClickListener),并执行一个内部操作。复选框的可见状态与预期一样-第一次单击勾号时,再次单击勾号将消失 现在我只想将可点击区域“扩展”到完整的列表条目-我的方法是使用ListView.setOnItemClickListener()安装一个OnItemClickListener,并在该侦听器中执行以下操作: re
OnClickListener
),并执行一个内部操作。复选框的可见状态与预期一样-第一次单击勾号时,再次单击勾号将消失
现在我只想将可点击区域“扩展”到完整的列表条目-我的方法是使用ListView.setOnItemClickListener()
安装一个OnItemClickListener
,并在该侦听器中执行以下操作:
resultView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
checkBox.performClick();
}
});
resultView.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
CheckBox=(CheckBox)view.findViewById(R.id.CheckBox);
checkBox.performClick();
}
});
这听起来很简单,但是有时(不是每次)复选框中的勾号不会出现在后面!我添加了一个复选框。invalidate()
,但这没有帮助
如何使复选框对单击完整列表条目项作出“反应”???
谢谢 而不是使用
performClick()
使用checkBox.setChecked(!checkBox.getChecked())代码>取而代之performClick()
将导致再次调用onClickListener
,这可能会导致递归,这可以解释您看到的奇怪行为。而不是使用performClick()
使用复选框。setChecked(!checkBox.getChecked())代码>取而代之performClick()
将导致再次调用onClickListener
,这可能会导致递归,从而解释您看到的奇怪行为。@Override
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v.findViewById(R.id.chkSelected);
TextView tv = (TextView) v.findViewById(R.id.tvName);
// pi = (PackageInfo) arg0.getItemAtPosition(position);
cb.performClick();
if (cb.isChecked()) {
checkedValue.add(tv.getText().toString());
} else if (!cb.isChecked()) {
checkedValue.remove(tv.getText().toString());
}
}
public void onItemClick(AdapterView arg0,视图v,内部位置,长arg3){
//TODO自动生成的方法存根
复选框cb=(复选框)v.findViewById(R.id.chkSelected);
TextView电视=(TextView)v.findviewbyd(R.id.tvName);
//pi=(PackageInfo)arg0.getItemAtPosition(位置);
cb.performClick();
if(cb.isChecked()){
checkedValue.add(tv.getText().toString());
}如果(!cb.isChecked()){
checkedValue.remove(tv.getText().toString());
}
}
@覆盖
public void onItemClick(AdapterView arg0,视图v,内部位置,长arg3){
//TODO自动生成的方法存根
复选框cb=(复选框)v.findViewById(R.id.chkSelected);
TextView电视=(TextView)v.findviewbyd(R.id.tvName);
//pi=(PackageInfo)arg0.getItemAtPosition(位置);
cb.performClick();
if(cb.isChecked()){
checkedValue.add(tv.getText().toString());
}如果(!cb.isChecked()){
checkedValue.remove(tv.getText().toString());
}
}
是否已将复选框的属性android:focusable和android:clickable设置为false?这会将clickevent引用到复选框的父项,在本例中,您的列表项是否已将复选框的属性android:focusable和android:clickable设置为false?这会将clickevent引用到复选框的父项,在本例中,您的列表项我尝试过这样做-但奇怪的是,这根本不会更改复选框的状态。。。另外:我需要执行的操作没有完成,因为根本没有调用侦听器。我应该手动调用我的侦听器吗?奇怪:如果我同时调用这两个函数,首先是setChecked(),然后是performClick(),并设置断点,那么setChecked不会调用onClickListener(如预期的那样),但是performClick会调用-BIG,但是:检查状态不正确!使用setChecked将其设置为true,并调试到performClick调用的侦听器中,状态仍然为false!为什么?进一步考虑一下,在ListView/mclickliester
中更改状态时可能会出现一些奇怪的行为,我认为这是因为代码完成后会进行处理。我必须实现自己的适配器,在该适配器中使用稳定的ID,在onCreateView
中的每个视图的复选框中添加一个onClickListener
,并根据项目的稳定id是否包含在列表视图中的getCheckedItemIds
中,在onCreateView
中设置复选框的选中状态。Mark,感谢您的建议!我重新设计了我的整个设置,复选框现在只显示状态,它们不再是可点击或可聚焦的-所有操作都在侦听器中执行。这很有效。我被搞砸了,因为当你有两个听众时发生了复杂的事情!我尝试过这样做-但奇怪的是,这根本不会改变复选框的状态。。。另外:我需要执行的操作没有完成,因为根本没有调用侦听器。我应该手动调用我的侦听器吗?奇怪:如果我同时调用这两个函数,首先是setChecked(),然后是performClick(),并设置断点,那么setChecked不会调用onClickListener(如预期的那样),但是performClick会调用-BIG,但是:检查状态不正确!使用setChecked将其设置为true,并调试到performClick调用的侦听器中,状态仍然为false!为什么?进一步考虑一下,在ListView/mclickliester
中更改状态时可能会出现一些奇怪的行为,我认为这是因为代码完成后会进行处理。我必须实现自己的适配器,在该适配器中使用稳定的ID,在onCreateView
中的每个视图的复选框中添加一个onClickListener
,并根据项目的稳定id是否包含在列表视图的getCheckedItemIds
中,在onCreateView
中设置复选框的选中状态。Mark,感谢您的建议