如何清除列表视图上的项目选择

时间:2015-03-05 11:52:40

标签: android listview android-listview

我已将选择颜色设置为列表视图项

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rowTextView" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:padding="10dp"
android:textColor="@drawable/text_selector"
android:textSize="16sp" >

但是当listview失去焦点时,最后一项的文本颜色将保持选定状态。

enter image description here - &gt; enter image description here

我尝试了以下代码,但它无效

View v = mainListView.getSelectedView();
v.setSelected(false);

有没有办法清除项目选择?

编辑。

在使用不同平台进行检查后,该解决方案仍然无法在Android 4.4.4的某些设备上运行(例如:Nexus 10),但它可以在Android 4.3设备上正常运行。

感谢。

3 个答案:

答案 0 :(得分:1)

  

但是当listview失去焦点时,最后一项的文本颜色将保持选定状态。

请从您的选择器drawable xml中删除state_selected并为其声明一些choiceMode。 我的ListView声明:

<ListView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:choiceMode="singleChoice"
    android:listSelector="@drawable/main_list_selector"
    ...

我的列表视图选择器(main_list_selector.xml):

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/button_focused"/>

    <item android:state_pressed="true" android:drawable="@drawable/button_checked_background"/>
    <item android:state_activated="true" android:drawable="@drawable/button_checked_background"/>
</selector>

行项目布局:

<?xml version="1.0" encoding="utf-8"?>
<com.example.yourapp.ui.checkable.CheckableLinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <CheckedTextView
        android:id="@+id/item_text_view"
        ...
        android:background="@drawable/row_item background"/>
</com.example.yourapp.ui.checkable.CheckableLinearLayout>

row_item背景:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/button_checked_background"/>
    <item android:drawable="@android:color/transparent"/>
</selector>

如你所见,我正在使用CheckedTextView,背景为“row_item background”,它具有drawable state_checked和custon LinearLayout。 LinearLayout代码:

public class CheckableLinearLayout extends LinearLayout implements Checkable {
    private boolean checked = false;

    public CheckableLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean isChecked() {
        return this.checked;
    }

    @Override
    public void setChecked(boolean checked) {
        this.checked = checked;
        this.setSelected(this.checked);

        final int childsCount = getChildCount();
        for (int i = 0; i < childsCount; ++i) {
            View child = getChildAt(i);
            if (child instanceof Checkable) {
                ((Checkable) child).setChecked(checked);
            }
        }
    }

    @Override
    public void toggle() {
        setChecked(!this.checked);
    }
}

我在这个https://stackoverflow.com/a/7425650/2133585答案中发现了一些隐藏的机器人逻辑。

答案 1 :(得分:0)

试试这个:

v.clearChoices();
v.requestLayout();

编辑:

根据此链接ListView selection remains persistent after exiting choice mode,您还可以尝试:

v.clearChoices();
for (int i = 0; i < v.getCount(); i++)
    v.setItemChecked(i, false);
v.post(new Runnable() {
    @Override
    public void run() {
        v.setChoiceMode(ListView.CHOICE_MODE_NONE);
    }
});

答案 2 :(得分:0)

由于上述解决方案仍无法在某些设备上运行,因此我找到了解决此问题的解决方案。

private View mSelectedView; // the view has been selected


// set text color when the list view get focus or not
mainListView.setOnFocusChangeListener(new OnFocusChangeListener() {
    if(hasFocus) {
        if(mSelectedView != null && mSelectedView instanceof TextView)
            ((TextView)mSelectedView).setTextColor(getResources().getColorStateList(R.drawable.text_selector));
    } else {
        mSelectedView = mainListView.getSelectedView();
        if(mSelectedView != null && mSelectedView instanceof TextView)
            ((TextView)mSelectedView).setTextColor(getResources().getColor(R.color.default_color));
    }
});