studio llenar example dinamico desplegable custom arrayadapter android listview android-layout

android - llenar - ListView Item Selected State no funciona



listview dinamico android studio (4)

@Andrew S: Junto con el uso del estado activado en el selector, el estado activado debe establecerse en falso para el caso predeterminado como se muestra en el código del selector a continuación.

<?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>

Así que tengo un ListView y quiero cambiar el color de fondo y texto de cada elemento. Este ListView está dentro de un ListFragment. Mi código infla el diseño en el onCreateView e infla el diseño de cada elemento en el nuevo newView .

El android:state_pressed="true" funciona bien, siempre que android:state_pressed="true" un elemento, el fondo cambia a ese color. Pero al seleccionar un elemento, ni el color bg ni el color del texto cambian, aunque he definido un elemento con android:state_selected="true" en el selector.

Edición: Estoy usando SDK nivel 11 (Android 3.0) y un Motorola Xoom.

El diseño del fragmento de lista:

<?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>

El diseño de la lista de elementos:

<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>

El selector de fondo:

<?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>

El selector de texto:

<?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>


La mejor solución con soporte de todos los niveles de API es implementar la característica de Verificable para la View elemento de la lista, lo que significa que la vista superior del diseño de su elemento de la lista debe implementar la interfaz de Checkable (en mi caso, fue TextView, pero la misma puede aplicarse en ViewGroup clases como LinearLayout ). Al hacer clic en un elemento de la lista, el método setChecked ListView y allí cambiamos el estado de Vista para usar android:state_checked="true" selector. Junto con la vista de lista de android:choiceMode="singleChoice" seleccionará solo un elemento.

El truco consiste en anular el método onCreateDrawableState y establecer el estado marcado aquí para dibujar. Vea el ejemplo de abajo en SelectableTextView . Una setChecked se llama a setChecked , el estado marcado se almacena y se llama refreshDrawableState .

Ejemplo de 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; } }

Ejemplo de diseño 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"/>

Ejemplo de 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>

Ejemplo de 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>



No olvide configurar clickable="true" para el diseño. Esto solucionó mi problema.

Lista de elementos de diseño:

<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>

Selector de fondo:

<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>