单击时取消选中项目

时间:2014-06-16 18:11:09

标签: android android-layout android-listview android-4.4-kitkat checkedtextview

我的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),但它的工作方式相同。

有没有其他方法可以检测到我点击了一个已检查的项目,以便我可以取消选中它?

3 个答案:

答案 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。