2011-12-19 73 views
9

Sé que Android no resalta nada en TouchMode. Pero estoy haciendo algo similar a la aplicación de Gmail en la que selecciona cosas del lado izquierdo y muestra detalles en el lado derecho de la actividad (me pregunto cómo Google lo hizo).¿Cómo resaltar el elemento seleccionado en ListView?

Así que la historia es que tengo que destacar lo que se ha seleccionado en el lado izquierdo ListView. He encontrado algunas preguntas similares y las soluciones son básicamente:

1.override método getView del adaptador y setBackground para la posición seleccionada

2.setBackground de la vista onItemClick y claro que para la selección de las anteras

Pero ninguno de ellos funcionó para mí debido a un comportamiento extraño: al hacer clic en un elemento y resaltarlo, también se resalta el quinto elemento después de él, y así sucesivamente a medida que me desplazo hacia abajo en la lista.

¿Alguna sugerencia? ¡GRACIAS!

Respuesta

21

Use listView.setChoiceMode (int choiceMode);

Parámetros

choiceMode Uno de CHOICE_MODE_NONE, CHOICE_MODE_SINGLE o CHOICE_MODE_MULTIPLE de la clase android.widget.AbsListView

http://developer.android.com/reference/android/widget/AbsListView.html#setChoiceMode(int)

También es necesario añadir MultiChoiceModeListener, puede tener CHOICE_MODE_SINGLE

(android.widget.AbsListView.MultiChoiceModeListener)

Ver en la muestra a continuación

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List16.html

+0

¿Eso hace algo? Lo intenté pero el selector no se quedó aunque .. – Han

+0

agregó más explicación –

+0

¡Muchas gracias! ¡Al agregar un MultiChoiceModeListener y establecer el fondo del adaptador en el archivo xml funcionó! Pero me pregunto por qué Android toma el color de fondo solo cuando se selecciona el artículo ... de manera automática – Han

1

La razón por la que está resaltando varios elementos probablemente se deba a que está: reutilizando toda la vista o configurando el fondo de ambas vistas en la misma instancia de Drawable. Si tiene el mismo dibujo en la pantalla dos veces, todos los eventos que suceden al primero pasarán a todos los demás, porque esa lógica se implementa en la instancia del propio Drawable.

Para solucionar esto, ya sea: No vuelva a utilizar las vistas de varias filas, o no reutilizar los dibujables para varias filas (crear uno nuevo cada vez)

Sé que esto suena muchos recursos y se es, pero a menos que tenga una mejor solución descubierta, esta es la solución más fácil.

+0

gracias hombre .. ahora estoy tratando de ver dónde está el código vuelve a utilizar la vista, ya que no escribí. Por cierto, ¿es posible dejar que el selector permanezca en la parte superior como un resaltado en lugar de cambiar el fondo? Tiene más sentido si es factible. – Han

0

Debido a que los artículos en los imita listviews los que está en la parte superior, sino que también imita el fondo de ellos. Debe establecer cada uno de los fondos de sus elementos en la función getView(). En cada elemento de getView(), debe establecer el fondo tanto para los seleccionados como para los no seleccionados.

16

esto es para ListActivity costumbre o ListFragment

destacado elemento seleccionado en ListView

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long arg3) 
{ 

    for(int a = 0; a < parent.getChildCount(); a++) 
    { 
     parent.getChildAt(a).setBackgroundColor(Color.TRANSPARENT); 
    } 

    view.setBackgroundColor(Color.GREEN); 
} 
2

//// @ estirable/list_selector

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:drawable="@drawable/list_item_bg_normal" 
android:state_pressed="false" android:state_selected="false" android:state_activated="false"/> 

<item android:drawable="@drawable/list_item_touch" 
android:state_pressed="true"/> 

<item android:drawable="@drawable/list_item_touch" 
android:state_pressed="false" android:state_selected="true"/> 

<item android:drawable="@drawable/list_item_bg_pressed" 
android:state_activated="true"/> 

</selector> 

//////// //////////// y en ListView

<ListView 
    android:id="@+id/list_slidermenu" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="singleChoice" 
    android:dividerHeight="1dp" 
    android:listSelector="@drawable/list_selector" 
    android:background="@color/list_background" 
    android:divider="#060606"/> 

/////////////////////// vista de lista de artículos

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/list_selector"> 

    <ImageView 
    android:id="@+id/icon" 
    android:layout_width="35dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="12dp" 
    android:layout_marginRight="12dp" 
    android:contentDescription="@string/desc_list_item_icon" 
    android:src="@drawable/ic_home" 
    android:layout_centerVertical="true" /> 

    </RelativeLayout> 
0

utilizar esto como lista de selección:

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

y esto list_bg :

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/list_bg_color" /> 
</shape> 

elegir el color de resaltado preferido

Cuestiones relacionadas