2011-05-02 21 views
32

Tengo 1 vista de lista contactslist. Escribí el código para resaltar el elemento seleccionado en el ListView. Está funcionando. Cuando hago clic en 1 elemento, se resalta ese elemento, pero el problema es que si hago clic en otro elemento también lo resaltaré. Quiero resaltar solo el elemento seleccionado. La selección anterior deberá desaparecer cuando haga clic en otro elemento.destacando el elemento seleccionado en la vista de lista en android

arg1.setBackgroundResource(R.drawable.highlighter); 

Este es el código en el oyente click que se usa para resaltar el elemento seleccionado. por favor ayudame.

actualización
Soy la creación del fondo de las filas en el adaptador:

public int[] colors = new int[]{0xFFedf5ff, 0xFFFFFFFF}; 
public int colorPos; 

[...] 
colorPos = position % colors.length; 
row.setBackgroundColor(colors[colorPos]); 
+0

Si la respuesta es aceptable, puedo aceptar dat.but si la respuesta no me ayuda den ¿cómo puedo aceptar eso? –

+0

Si no está satisfecho con las respuestas, simplemente olvide la parte de impulso de mi comentario anterior. Pero un poco más de información realmente nos ayudaría a descubrir dónde están sus raíces problemáticas y cómo ayudarlo. ¡gracias! – rekaszeru

+0

estoy usando el diseño relativo. Estoy configurando el fondo para la vista de lista usando un adaptador, mi lógica es si el rawnum es impar da un color de fondo y si es un número par da otro color de fondo. A continuación está la implementación lógica.público int [] colors = new int [] {0xFFedf5ff, 0xFFFFFFFF}; \t public int colorPos; \t colorPos = position% colors.length; \t \t row.setBackgroundColor (colores [colorPos]); –

Respuesta

105

ListViews por defecto no tienen un conjunto choiceMode (que está establecido en none), por lo que la selección actual no está indicado visualmente Para cambiar esto, solo tiene que establecer el atributo choiceMode de su ListView en singleChoice.
Si desea crear un fondo personalizado para los elementos seleccionados en su lista, también debe establecer el atributo listSelector. Allí puede especificar no solo los colores, sino también los drawables (imágenes, capas/estado-dibujables).

<ListView android:id="@+id/my_list" 
     android:choiceMode="singleChoice" 
     android:listSelector="@android:color/darker_gray" /> 

Si no utiliza un ListView directamente, sino un ListActivity, a continuación, estos atributos se deben establecer a partir del código, por lo que debe extender el método de su actividad onCreate con estas líneas:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
getListView().setSelector(android.R.color.darker_gray); 

Por lo tanto, si estaba usando un oyente de clic para cambiar el fondo de la fila seleccionada, elimínelo de su código y utilice el método adecuado desde arriba.

respuesta a la actualización

Si se establece el fondo de su método getView, en lugar de utilizar un color estático, solicitar una lista dibujable estado a un segundo plano fila con duplicateParentState establecido en true. De esta manera se va a cambiar su pantalla basada en el estado actual de la máquina: normal, concentrado, prensado, etc.

+0

intenté con este código, pero si hago la lista vista choice_mode_single den, el primer elemento seleccionado es destacando, pero si selecciono otro elemento, no se resalta. –

+1

¿hay algún método o propiedad para obtener el elemento seleccionado previamente en la vista de lista? –

+0

¿eliminaste el código donde configuraste el fondo usando un oyente onitemclick? – rekaszeru

0

intenta esto en onListItemClick

view.getFocusables(POSITION); 
view.setSelected(true); 

Se resalta la selección.

7

Una mejor manera es en su tema, @ estirable/list_selector

list_selector.xml:

<!-- <item android:drawable="@color/android:transparent" android:state_selected="true" /> --> 
<item android:drawable="@color/list_bg" android:state_selected="true"/> 
<item android:drawable="@color/list_bg" android:state_activated="true"/> 
<item android:drawable="@color/transparent"/> 

continuación, poner el fondo de raíz de su androide list_row.xml : background = "?Android: attr/activatedBackgroundIndicator "

20

en el XML listview añadir el "" modo

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:choiceMode="singleChoice" 
    (...) > 
</ListView> 

En el diseño de la lista de elementos añadir

androide: Fondo =" singleChoice? androide : attr/activatedBackgroundIndicator

ex Amplio

<?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="wrap_content" 
    android:orientation="horizontal" 
    android:background="?android:attr/activatedBackgroundIndicator"> 

    <!-- your item content--> 

</LinearLayout> 
+0

¿Por qué no es esto lo primero que aparece en Google? He estado intentando durante horas hacer que esto funcione. Intenté todo tipo de estados y combinaciones de estados (seleccionados, activados, enfocados, etc.) en un selector dibujable con 'android: listSelector =" @ dibujable/theSelector "' establecido, pero cuando funcionó tenía errores (el indicador de selección Me quedaría atascado mientras navegaba por la lista, incluso quedándome entre dos elementos a veces). Esto finalmente lo hizo funcionar correctamente. GRACIAS. –

Cuestiones relacionadas