ListView项目select状态不工作

所以我有一个ListView,我想改变每个项目的背景和文字的颜色。 这个ListView是在一个ListFragment中。 我的代码膨胀了onCreateView的布局,并膨胀newView的每个项目的布局。

android:state_pressed="true"工作正常,只要我在一个项目中按下背景更改为该颜色。 但是,当select一个项目时,即使我已经在select器中用android:state_selected="true"定义了一个项目,bg颜色或文本颜色也不会改变。

编辑:我使用SDK级别11(Android 3.0)和摩托罗拉Xoom。

列表片段布局:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </LinearLayout> 

列表项目布局:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="25dp" android:background="@drawable/list_item_bg_selector"> <TextView android:id="@+id/form_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="@dimen/text_size_xlarge" android:textStyle="bold" android:textColor="@drawable/list_item_text_selector" /> <TextView android:id="@+id/form_subtitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="@dimen/text_size_medium" android:textStyle="normal" android:layout_marginTop="5dp" android:textColor="@drawable/list_item_text_selector" /> </LinearLayout> 

背景select器:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/white" /> <item android:state_selected="true" android:drawable="@drawable/list_item_bg_selected" /> <item android:drawable="@color/list_bg" /> </selector> 

文本select器:

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

Solutions Collecting From Web of "ListView项目select状态不工作"

答案是使用android:state_activated="true"状态,而不是“selected”状态。 更多关于这里: ListFragment项目select的背景

支持所有API级别的最佳解决scheme是实现列表项View Checkable特性,这意味着列表项布局的顶视图必须实现Checkable接口(在我的情况下,它是TextView,但是ViewGroup也可以应用相同的像LinearLayout类)。 当你点击一个列表项时, ListView调用setChecked方法,在那里我们改变View的状态来使用android:state_checked="true"select器。 与列表视图一起android:choiceMode="singleChoice"它将只select一个项目。

诀窍是重写onCreateDrawableState方法,并在此处为可绘制设置已检查的状态。 见下面的SelectableTextView例子。 调用setChecked之后,检查状态被存储并调用refreshDrawableState

SelectableTextView示例:

 package com.example.widget.SelectableTextView; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.util.AttributeSet; import android.widget.Checkable; import android.widget.TextView; public class SelectableTextView extends TextView implements Checkable { private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked }; private boolean mChecked; public SelectableTextView(Context context) { super(context); } public SelectableTextView(Context context, AttributeSet attrs) { super(context, attrs); } public SelectableTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public SelectableTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); } } @Override public boolean isChecked() { return mChecked; } @Override public void toggle() { setSelected(!mChecked); } @Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); if (isChecked()) { mergeDrawableStates(drawableState, CHECKED_STATE_SET); } return drawableState; } } 

selectable_list_item.xml布局示例:

 <?xml version="1.0" encoding="utf-8"?> <com.example.widget.SelectableTextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="match_parent" android:textColor="@color/list_item_selector_foreground" android:background="@drawable/list_item_selector_background" tools:text="Item 1"/> 

list_item_selector_foreground.xml示例:

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

list_item_selector_background.xml示例:

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

不要忘记为布局设置clickable="true" 。 这解决了我的问题。

列表项目布局:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/list_item_bg_selector" android:clickable="true" > <TextView android:id="@+id/tvNewsPreviewTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:maxLines="3" android:ellipsize="end" android:textSize="@dimen/news_preview_title_textsize" android:textStyle="bold" /> </RelativeLayout> 

背景select器:

  <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/black" /> <gradient android:startColor="@color/white" android:endColor="@color/white" /> </shape> </item> <item> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/holo_gray_darker" /> <gradient android:startColor="@color/holo_gray_bright" android:endColor="@color/holo_gray_bright" /> </shape> </item> </selector> 

@Andrew S:除了在select器中使用激活状态,激活状态在默认情况下必须设置为false,如下面的select器代码所示。

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false" android:state_activated="false" android:color="@color/dark_text_blue"/> <item android:state_pressed="true" android:color="@color/red"/> <item android:state_activated="true" android:color="@color/red"/> </selector>