walter steinmeier mapa cultura capital alemania android android-listview

android - steinmeier - Mostrando la selección actual en una lista



alemania wikipedia (4)

Como se ve en la versión para tableta de gmail y google talk, estoy tratando de mostrar la selección actual en una vista de lista. Sé que esto no es una práctica estándar y debe evitarse cuando sea necesario. En mi programa, la vista de lista siempre está en la pantalla y el elemento seleccionado muestra un nuevo fragmento a la derecha (similar a Gmail y Google Talk).

Para evitar que el usuario adivine qué elemento ha sido seleccionado, me gustaría mostrar la selección actual. Intenté crear un selector, pero después de hacer clic se vuelve al fondo normal.

¿Cómo puedo conseguir esto?

este es mi selector xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/list_item_bg2" android:state_pressed="false" android:state_selected="false" android:state_focused="false"/> <item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true"/> <item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="false" android:state_selected="true" android:state_checked="false"/> <item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="true" android:state_selected="false"/> <item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="false" android:state_focused="false" android:state_selected="false" android:state_checked="true"/> <item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true" android:state_focused="true" android:state_selected="true" android:state_checked="true"/> <item android:drawable="@drawable/list_item_selected_bg2" android:state_pressed="true"/> </selector>


Lo que Gmail y aplicaciones similares usan es el estado activated , con un diseño de fila apropiado. Ver:

En pocas palabras, usted:

  • Utilice un diseño de fila con un fondo activado (por ejemplo, android.R.layout.simple_list_item_activated_1 )
  • Use setChoiceMode(ListView.CHOICE_MODE_SINGLE) en su ListView
  • "Verifique" la fila que debe activarse usando setItemChecked() en su ListView para habilitar el estado "activado" y tener el resaltado persistente

Lo que funcionó para mí

  1. anula el estilo ListView global en su tema

    <item name="android:listViewStyle">@style/MyListView</item>

  2. define tu estilo

    <style name="MyListView" parent="@android:style/Widget.ListView"> <item name="android:listSelector">@drawable/listview_background_selector</item> </style>

  3. define el selector listview_background_selector.xml

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_mediumAnimTime" android:exitFadeDuration="@android:integer/config_mediumAnimTime"> <item android:drawable="@color/ListViewBackGroundColorPressed" android:state_activated="true" /> </selector>

  4. establece el fondo de tu lista vista-elemento-diseño

    android:background="?android:attr/activatedBackgroundIndicator"


Si usa un diseño personalizado para cada fila:

  1. crea un selector con android: state_activated = "true"
  2. aplícalo como fondo del diseño personalizado.

un ejemplo del selector dibujable:

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


Su otra opción es establecer el fondo de su elemento de lista personalizado en android: background = "? Android: attr / activatedBackgroundIndicator"