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
?给你一些参考资料