android - programacion - Resalte la fila seleccionada de ListView
cambiar el color del texto de un listview android (12)
Tengo una lista de álbumes (varios cientos). Cuando toco el álbum seleccionado, quiero ofrecer al usuario la opción de reproducir todo el álbum o mover a su pista ListView. No hay problema. Sin embargo, después de tocar el ablum en albumListView, quiero que la fila permanezca resaltada para que el usuario sepa en qué elemento han hecho clic, y luego puede mover a OK o PLAY. ¿Cómo destaco una fila en ListView?
Aquí está mi solución Listview:
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:divider="@android:color/darker_gray"
android:dividerHeight="1dp"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:choiceMode="singleChoice"
android:paddingTop="8dip" >
</ListView>
Escribe un selector para list_row como
<!-- <item android:drawable="@color/android:transparent" android:state_selected="true" /> -->
<item android:drawable="@android:color/darker_gray" android:state_selected="true"/>
<item android:drawable="@android:color/darker_gray" android:state_activated="true"/>
<item android:drawable="@android:color/darker_gray" android:state_pressed="true"/>
<item android:drawable="@color/android:transparent"/>
Asegúrate de tener un artículo para state_activated = true
A continuación, agregue este selector como su fondo list_row
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/listitem_selector"
android:orientation="vertical" >
<TextView
android:id="@+id/itemName"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Citado de http://android-developers.blogspot.de/2008/12/touch-mode.html
Imagine una aplicación simple, ApiDemos por ejemplo, que muestra una lista de elementos de texto. El usuario puede navegar libremente por la lista usando la bola de seguimiento pero también, alternativamente, desplazarse y lanzar la lista usando la pantalla táctil. El problema en este escenario es cómo manejar la selección correctamente cuando el usuario manipula la lista a través de la pantalla táctil.
En este caso, si el usuario selecciona un elemento en la parte superior de la lista y luego arroja la lista hacia abajo, ¿qué debería pasar con la selección? ¿Debería permanecer en el elemento y desplazarse fuera de la pantalla? ¿Qué pasaría si el usuario decidiera mover la selección con la rueda de desplazamiento? O peor, ¿qué pasaría si el usuario presiona la bola de seguimiento para actuar sobre el elemento seleccionado actualmente, que ya no se muestra en la pantalla?
Después de una cuidadosa consideración, decidimos eliminar la selección por completo, cuando el usuario manipula la interfaz de usuario a través de la pantalla táctil.
En el modo táctil, no hay foco ni selección. Cualquier elemento seleccionado en una lista de una cuadrícula se deselecciona tan pronto como el usuario ingresa al modo táctil. Del mismo modo, los widgets enfocados se desenfocan cuando el usuario ingresa al modo táctil. La siguiente imagen ilustra lo que ocurre cuando el usuario toca una lista después de seleccionar un elemento con la bola de seguimiento.
En mi caso, al usar simple_list_item_2, la única solución era anular el método getView () del adaptador, y simplemente cambiar el color de fondo manualmente:
listview = new SimpleAdapter(ctx, data,
android.R.layout.simple_list_item_2, res,
new String[] {"field1", "field2" },
new int[] {android.R.id.text1, android.R.id.text2 })
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if (this_is_the_selected_item)
{
view.setBackgroundColor(0xff999999);
}
else
{
view.setBackgroundColor(Color.BLACK);
}
return view;
}
};
Recuerde llamar a listview.invalidateViews () cada vez que cambie el elemento seleccionado.
Esto es lo que hice :) - después de un gran golpe contra la pared.
Para el adaptador:
radioAdapter = new RadioAdapter(context, R.layout.row_layout, yourData);
Para el row_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radio_name"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:padding="10dp"
android:background="?android:attr/activatedBackgroundIndicator"
android:clickable="true"
android:text="SOME RADIO"
android:textColor="@color/Gray"
android:textSize="25dp" />
Para establecer una posición predeterminada para resaltar simplemente haz esto con tu objeto listView:
radioTitleList.setItemChecked (defaultPosition, true);
Si desea resaltar cuando hace clic en la lista:
En su getView () en su adaptador de lista personalizada, agregue esto antes de devolver la vista:
row.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
radioTitleList.setItemChecked(position, true);
// other stuff like navigating to a new activity etc
}
});
Implemente su lista con el modo de elección única: android:choiceMode=singleChoice
Del mismo modo que el predeterminado android.R.layout.simple_list_item_single_choice
utiliza un RadioButton
para indicar la opción seleccionada, puede implementar un estado de resaltado personalizado o similar en el diseño de su elemento de lista para responder a los cambios de elección. Métodos como getCheckedItemPosition()
pueden ser utilizados por su aplicación para determinar qué elemento ha elegido el usuario actualmente, si es necesario.
¡Espero que ayude!
La siguiente solución se puede usar para resaltar uno o más elementos de la lista. Punto de partida: hay un ListFragment para mostrar una Lista de MyEntity a través de una implementación ArrayAdapter. El color de un TextView como parte del diseño del elemento debe cambiar a gris, si el elemento está seleccionado. Múltiples artículos deben ser seleccionables.
ListFragment debe proporcionar un elemento OnItemSelectListener (elemento YourEntity) al que se invocará onListItemClicked ().
public void onListItemClick(ListView l, View v, int position, long id) { MyEntity entity = (MyEntity) getListView().getItemAtPosition(position); if (entityListSelectListener != null) itemSelectListener.onItemSelect(entity); }
ArrayAdapter posee una lista para los campos clave para los elementos seleccionados y proporciona los métodos de administrador addSelection (MyEntity) y clearAllSelections (). El método reemplazado getView () lee la lista de campos clave y, si la posición real está allí, cambia el color particular de TextView a gris, de lo contrario a transparente.
public View getView(int position, View convertView, ViewGroup parent) { ... if (selectedEntityList.contains(entity.key)) //... highlight view field }
En onCreate () de la actividad propietaria, los oyentes deben implementarse para administrar el ArrayAdapter: llamar a addSelection () y notifyDataSetChanged ().
entityListFragment.setEntityListSelectListener( new EntityListFragment.OnItemSelectedListener() { public void onItemSelect(MyEntity entity) { aa.addSelection(entity); aa.notifyDataSetChanged(); }});
Lo resolví ampliando ListView y reemplazando el método getView (). Mantuve un identificador interno para el estado "seleccionado" y cambié el fondo del elemento de acuerdo con él, así:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View currView = super.getView(position, convertView, parent);
StateListItem currItem = getItem(position);
if (currItem.isItemSelected) {
currView.setBackgroundColor(Color.RED);
} else {
currView.setBackgroundColor(Color.BLACK);
}
return currView;
}
Tengo un programa de ejemplo en mi blog: http://udinic.wordpress.com/2011/07/01/selectablelistview-make-selection-work/
Maaalte es correcto, en las listas de modos táctiles no se muestra el foco resaltado en un elemento actual ya que no hay un elemento actual en el modo táctil. La selección de estado como la que describes que persiste mientras interactúas con otras partes de la UI es otra cuestión.
Puede usar CHOICE_MODE_SINGLE para expresar una selección con estado en una lista. Tratará la selección como un estado verificado. Siempre que la vista de que su adaptador regrese implemente la interfaz de Checkable, puede mostrar el estado seleccionado de la forma que elija. (Estableciendo un fondo en la vista del elemento o de otra manera. En realidad, no necesita mostrar un widget de casilla de verificación). Luego puede usar los métodos verificados como elementos de ListView para manipular o determinar la selección.
Otra solución (principalmente en XML)
1) establece el choiceMode
de ListView
en singleChoice
<ListView
android:choiceMode="singleChoice"
.../>
2) Los elementos de la lista deben ser Checkable y usar una Lista de estado de color como Fondo
por ejemplo: album_item.xml
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/list_selector"
.../>
3) el estado del color de fondo ( list_selector.xml
) define el color de resaltado
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/green" android:state_checked="true"/>
<item android:drawable="@color/green" android:state_pressed="true"/>
</selector>
Sé que han pasado dos años desde que esta pregunta estuvo activa por última vez, pero solo en caso de que alguien más la necesite en el futuro. Aquí está mi código ListView xml
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/results"
android:choiceMode="singleChoice"
android:listSelector="#ffdb700b"/>
Desea cambiar el valor de android:listSelector
.
Tuve el mismo problema, lo resolví pegando el siguiente código en el código ListView
android:choiceMode="singleChoice"
android:listSelector="#003366"
El archivo xml se ve como el siguiente
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
android:id="@+id/file_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice"
android:listSelector="#003366"/>
<Button
android:id="@+id/select"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="SELECT"
android:layout_below="@id/file_list"/>
</RelativeLayout>
agregar android:background="?activatedBackgroundIndicator
para mostrar el diseño principal del elemento similar a android.R.layout.simple_list_item_activated_2.xml