Android 单击项目时取消选中该项目
我有一个Android 单击项目时取消选中该项目,android,android-layout,android-listview,android-4.4-kitkat,checkedtextview,Android,Android Layout,Android Listview,Android 4.4 Kitkat,Checkedtextview,我有一个ListActivty列表视图选择模式设置为choice\u mode\u SINGLE项目布局只包含一个CheckedTextView。默认情况下,显示“活动”时,所有项目均未选中。如果用户单击某个项目,则会自动选中该项目,并显示复选标记。单击另一项将取消选中上一项。所有这些都是开箱即用的 我想做的是取消选中用户单击已选中项目时的项目。我已重写了onListItemClick方法,以检测项目是否已选中,并按如下方式取消选中: @Override protected void onLis
ListActivty
列表视图选择模式设置为choice\u mode\u 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)
,但效果相同
是否有其他方法可以检测到我单击了选中的项目,以便取消选中它?KitKat
AbsListView
在处理单击后通知侦听器,因此当您在侦听器中调用checkedTextView.isChecked()
时,它已被选中
尝试创建覆盖performItemClick()
的自定义ListView,在超级调用之前保存项目状态,并在类似以下命令(未测试)后对其进行操作:
KitKat
AbsListView
在处理单击后通知侦听器,因此当您在侦听器中调用checkedTextView.isChecked()
时,它已经被选中
尝试创建覆盖performItemClick()
的自定义ListView,在超级调用之前保存项目状态,并在类似以下命令(未测试)后对其进行操作:
没有一个“优雅”的解决方案
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. */));
myList.setOnItemClickListener(新的OnItemClickListener(){
私有int itemSelectedIndex;
/**
*初始值设定项“代理”。
*
*@param索引
*@返回
*/
公共侦听器初始化(int索引){
itemSelectedIndex=索引;
归还这个;
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
如果(itemSelectedIndex!=位置){
itemSelectedIndex=位置;
getArguments().putInt(ListView.class.getName(),位置);
}否则{
itemSelectedIndex=-1;
listTravelBags.setItemChecked(位置,false);
getArguments().putInt(ListView.class.getName(),-1);
}
}
}.init(getArguments().getInt(ListView.class.getName(),-1)/*获取配置更改/重新启动后的最后一个选中项,等等。*/);
注意:getArguments()
是片段中的一个方法。如果您想使用某个活动(或者在您的情况下是ListActivity),请使用SharedReferences或您的savestate捆绑包。没有“优雅”的解决方案
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. */));
myList.setOnItemClickListener(新的OnItemClickListener(){
私有int itemSelectedIndex;
/**
*初始值设定项“代理”。
*
*@param索引
*@返回
*/
公共侦听器初始化(int索引){
itemSelectedIndex=索引;
归还这个;
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
如果(itemSelectedIndex!=位置){
itemSelectedIndex=位置;
getArguments().putInt(ListView.class.getName(),位置);
}否则{
itemSelectedIndex=-1;
listTravelBags.setItemChecked(位置,false);
getArguments().putInt(ListView.class.getName(),-1);
}
}
}.init(getArguments().getInt(ListView.class.getName(),-1)/*获取配置更改/重新启动后的最后一个选中项,等等。*/);
注意:
getArguments()
是片段中的一个方法。如果要使用某个活动(或者在您的情况下是ListActivity),请使用SharedReferences或您的savestate捆绑包。要选中或取消选中复选框上的项目,您可以在适配器内设置listener on复选框。在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));
}
希望对您有所帮助。要选中或取消选中复选框上的项目,您可以在适配器内设置listener on复选框。在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));
}
希望对您有所帮助。这不是可靠和/或官方来源的答案,但您可以添加一个变量来跟踪当前选定的项目,并独立于
checkedTextView.isChecked()覆盖其选中状态
@giorgi如果您使用的是自定义适配器,则首先更改特定位置的对象,然后使用此ItemAdapter.notifyDataSetChanged();我认为,当选中或取消选中特定列表项时,必须设置标记,因此,当您尝试同时选中时,从项标记获取此值。isChecked返回mChecked。为什么你认为它总是返回true
?某些引用是否要在列表行单击或复选框单击上选中和取消选中?不是来自可靠和/或官方来源的答案,但您可以添加一个变量来跟踪当前选定的项目,并独立于checkedTextView.isChecked()覆盖其选中状态
@giorgi如果您使用的是自定义适配器,则首先更改特定位置的对象,然后使用此ItemAdapter.notifyDataSetChanged();我认为,当选中或取消选中特定列表项时,必须设置标记,因此,当您尝试同时选中时,从项标记获取此值。isChecked返回mChecked。为什么你认为它总是返回true
?给你一些参考资料