我的ListActivty
列表视图选择模式设置为CHOICE_MODE_SINGLE
项目布局仅包含CheckedTextView
。默认情况下,显示活动时,将取消选中所有项目。如果用户点击某个项目,则会自动检查该项目并显示复选标记。单击另一个项目将取消选中上一个项目。所有这些都是开箱即用的。
我想要做的是取消选中用户点击已检查项目的项目。我已覆盖onListItemClick
方法来检测项目是否已经过检查并取消选中,如下所示:
@Override
protected void onListItemClick(ListView listView, View view, int position, long id) {
CheckedTextView checkedTextView = (CheckedTextView) view;
if (checkedTextView.isChecked()) {
listView.setItemChecked(position, false);
}
}
问题是在Android 4.4上checkedTextView.isChecked()
总是返回true:如果我点击未经检查的项目,它将返回true并单击选中的项目也会返回true。我尝试了listview.isItemChecked(position)
,但它的工作方式相同。
有没有其他方法可以检测到我点击了一个已检查的项目,以便我可以取消选中它?
答案 0 :(得分:4)
KitKat AbsListView
在处理完点击后会通知听众,因此在您的听众中调用checkedTextView.isChecked()
时已经检查过。
尝试创建自定义ListView,覆盖performItemClick()
,在超级调用之前保存项目状态,然后像这样(未经测试)对其进行操作:
@Override
public boolean performItemClick(View view, int position, long id) {
boolean checkedBeforeClick = isItemChecked(position);
super.performItemClick(view, position, id);
if (checkedBeforeClick) {
setItemChecked(position, false);
}
}
答案 1 :(得分:2)
要选中或取消选中复选框上的项目,可以在适配器内的CheckBox上设置侦听器。在onCheckedChangeListener里面你可以做你的东西。
如果要检查并取消选中列表行上的项目,可以在列表中设置onitemclicklistener,在onitemclick中可以写下:
String isChecked = fullItemList.get(position).getIsChecked();
CheckBox checkbox = (CheckBox) view.findViewById(R.id.check_box);
if(isChecked.equalsIgnoreCase("true")) {
fullItemList.get(position).setIsChecked("false");
checkbox.setChecked(false);
} else {
fullItemList.get(position).setIsChecked("true");
checkbox.setChecked(true);
checkedItemList.add(fullItemList.get(position));
}
希望它对你有所帮助。
答案 2 :(得分:0)
对此没有“优雅”的解决方案......
myList.setOnItemClickListener(new OnItemClickListener() {
private int itemSelectedIndex;
/**
* Initializer "proxy".
*
* @param index
* @return
*/
public OnItemClickListener init(int index) {
itemSelectedIndex = index;
return this;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (itemSelectedIndex != position) {
itemSelectedIndex = position;
getArguments().putInt(ListView.class.getName(), position);
} else {
itemSelectedIndex = -1;
listTravelBags.setItemChecked(position, false);
getArguments().putInt(ListView.class.getName(), -1);
}
}
}.init(getArguments().getInt(ListView.class.getName(), -1) /* get last checked item after config changes/restarts, etc. */));
注意:getArguments()
是Fragment中的一个方法。如果您想使用Activity(或者在您的情况下使用ListActivity),请使用SharedPreferences或您的savestate Bundle。