Cambiar el color de fondo del elemento seleccionado en un ListView

Quiero saber cómo puedo cambiar el color de fondo del elemento seleccionado en mi listView. Sólo quiero cambiar el elemento específico pulsado por el usuario, lo que significa que si el usuario hace clic en otro elemento será el que está resaltado. Bueno, ya que quiero mantener lo más simple posible y utilizar el predeterminado android listview He utilizado este código en su lugar:

record_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { try{ for (int ctr=0;ctr<=record_items.length;ctr++){ if(i==ctr){ record_list.getChildAt(ctr).setBackgroundColor(Color.CYAN); }else{ record_list.getChildAt(ctr).setBackgroundColor(Color.WHITE); } } } catch (Exception e){ e.printStackTrace(); } Log.v("Selected item",record_list.getItemAtPosition(i)); } }); 

Ok este está funcionando, pero el problema es que es lento. Ahora quiero saber si hay otra manera alrededor que puedo hacer que dará la misma salida que he hecho.

Intenté usar record_list.getSelectedView().setBackgroundColor(Color.CYAN); Pero me da una excepción de puntero nulo.

También intenté el selector.xml pero también no hizo el truco. Además, hay una propiedad aquí en ListView que se llama listSelector. Es un dibujable como se dijo en la documentación "Drawable utilizado para indicar el elemento seleccionado actualmente en la lista." También creo que esto debe hacer el truco y sí que hacer el truco en mi emulador, pero no en mi pestaña galaxia. También intenté los otros métodos, pero nada funciona como yo quería que fuera.

14 Solutions collect form web for “Cambiar el color de fondo del elemento seleccionado en un ListView”

Puede seguir la posición del elemento seleccionado actualmente:

  OnItemClickListener listViewOnItemClick = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) { mSelectedItem = position; mAdapter.notifyDataSetChanged(); } }; 

Y sobreescriba el método getView de su adaptador:

  @Override public View getView(int position, View convertView, ViewGroup parent) { final View view = View.inflate(context, R.layout.item_list, null); if (position == mSelectedItem) { // set your color } return view; } 

Para mí hizo el truco.

Puede utilizar un selector. Cambiar los valores de los colores y modificar el siguiente de acuerdo a sus necesidades.

Bkg.xml en carpeta dibujable

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/pressed" /> <item android:state_focused="false" android:drawable="@drawable/normal" /> </selector> 

Comprimido.xml en carpeta dibujable

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FF1A47"/> // color <stroke android:width="3dp" android:color="#0FECFF"/> // border <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp"/> <corners android:bottomRightRadius="7dp" // for rounded corners android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp"/> </shape> 

Normal.xml en carpeta dibujable

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FFFFFF"/> <stroke android:width="3dp" android:color="#0FECFF" /> <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp"/> <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp"/> </shape> 

Establecer el fondo dibujable para listview diseño personalizado para ser inflados para cada fila

Recomiendo usar un listview personalizado con un adaptador personalizado.

  android:background="@drawable/bkg" 

Si no ha utilizado un adaptador personalizado, puede establecer el selector de listas a listview como se muestra a continuación

  android:listSelector="@drawable/bkg" 

Definir variable

 private ListView mListView; 

Inicializar variable

 mListView = (ListView)findViewById(R.id.list_view); 

OnItemClickListener de listview

  mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adpterView, View view, int position, long id) { for (int i = 0; i < mListView.getChildCount(); i++) { if(position == i ){ mListView.getChildAt(i).setBackgroundColor(Color.BLUE); }else{ mListView.getChildAt(i).setBackgroundColor(Color.TRANSPARENT); } } } }); 

Construir y ejecutar el proyecto – Hecho

Si desea que el elemento permanezca resaltado después de haber hecho clic en él, deberá configurarlo manualmente como seleccionado en el listener onItemClick

Android ListView elemento seleccionado permanecer destacado :

 myList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { view.setSelected(true); // <== Will cause the highlight to remain //... do more stuff }}); 

Esto supone que tiene un elemento state_selected en su selector:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true" android:drawable="@color/red" /> <item android:state_enabled="true" android:state_focused="true" android:drawable="@color/red" /> <item android:state_enabled="true" android:state_selected="true" android:drawable="@color/red" /> <item android:drawable="@color/white" /> </selector> 

Primero puede crear un archivo xml selector como a continuación en su carpeta drawable/list_item_selector.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true"> <shape android:shape="rectangle"> <solid android:color="#333333" /> <padding android:left="5dp" android:right="5dp" /> </shape></item> <item><shape android:shape="rectangle"> <solid android:color="#222222" /> </shape></item> </selector> 

Y luego en tu lista, especifica el fondo como

 android:background="@drawable/list_item_selector" 

La forma más sencilla que he encontrado:

En su actividad XML añada estas líneas:

 <ListView ... android:choiceMode="singleChoice" android:listSelector="#666666" /> 

O programar estas propiedades:

 listView.setSelector(Drawable selector) listView.setSelector(int resourceId) 

Mi ejemplo particular:

  <ListView android:choiceMode="singleChoice" android:listSelector="#666666" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listView"/> 

Gracias a AJG: https://stackoverflow.com/a/25131125/1687010

Método 1:

Actualiza ListView en la actividad / fragmento de la estructura de xml:

 <ListView ... android:choiceMode="singleChoice" android:listSelector="@android:color/darker_gray" /> 

Eso es todo, ya está!

Si desea una forma programática para manejar esto, utilice el método 2 …

Método 2:

Si está utilizando un ListFragment puede anular onListItemClick (), utilizando la vista para establecer el color. Guardar la vista actual seleccionada para restablecer el color de la última selección.

Tenga en cuenta que esto sólo funciona en vistas de lista que se ajustan a una sola pantalla, ya que la vista se recicla.

 public class MyListFragment extends ListFragment { View previousSelectedItem; ... @Override public void onListItemClick(ListView parent, View v, int position, long id) { super.onListItemClick(parent, v, position, id); if (previousSelectedItem!=null) { previousSelectedItem.setBackgroundColor(Color.WHITE); } previousSelectedItem=v; v.setBackgroundColor(Color.BLUE); } } 

Utilice el xml abajo como fondo del listitem solucionará todas las ediciones. La opción seleccionada se resaltará mientras se desplaza hacia abajo.

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:color/holo_orange_dark" android:state_pressed="true"/> <item android:drawable="@android:color/holo_green_light" android:state_selected="true"/> <item android:drawable="@android:color/holo_green_light" android:state_activated="true"/> 

Gracias, Nagendra

También estoy haciendo lo mismo: resalte el fondo del elemento de la lista seleccionada (cambie a rojo) y ajuste el color del texto dentro del elemento a blanco.

Puedo pensar en una manera " sencilla pero no eficiente ": mantener la posición de un elemento seleccionado en el adaptador personalizado y cambiarlo en el implemento OnItemClickListener de ListView:

 // The OnItemClickListener implementation @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mListViewAdapter.setSelectedItem(position); } // The custom Adapter private int mSelectedPosition = -1; public void setSelectedItem (int itemPosition) { mSelectedPosition = itemPosition; notifyDataSetChanged(); } 

A continuación, actualice el fondo del elemento seleccionado y el color del texto en el método getView() .

 // The custom Adapter @Override public View getView(int position, View convertView, ViewGroup parent) { ... if (position == mSelectedPosition) { // customize the selected item's background and sub views convertView.setBackgroundColor(YOUR_HIGHLIGHT_COLOR); textView.setTextColor(TEXT_COLOR); } else { ... } } 

Después de buscar durante un tiempo, encontré que muchas personas mencionaron acerca de cómo establecer android:listSelector="YOUR_SELECTOR" . Después de probado por un tiempo, encontré que la forma más sencilla de resaltar el fondo del elemento ListView seleccionado se puede hacer con sólo dos líneas configuradas para el recurso de diseño de ListView:

 android:choiceMode="singleChoice" android:listSelector="YOUR_COLOR" 

También hay otra forma de hacerlo funcionar, como personalizar el tema activatedBackgroundIndicator . Pero creo que sería una solución mucho más genérica, ya que afectará a todo el tema.

Para aquellos que se preguntan lo que EXACTAMENTE debe hacerse para mantener las filas seleccionadas, incluso a medida que se desplaza hacia arriba. Es el state_activated El resto se encarga de la funcionalidad interna, no tiene que preocuparse de alternar y puede seleccionar varios elementos. No necesité usar los métodos notifyDataSetChanged () o setSelected (true).

Añadir esta línea a su archivo selector, para mí drawable \ row_background.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@android:color/holo_blue_light"/> <item android:state_enabled="true" android:state_pressed="true" android:drawable="@android:color/holo_blue_light" /> <item android:state_enabled="true" android:state_focused="true" android:drawable="@android:color/holo_blue_bright" /> <item android:state_enabled="true" android:state_selected="true" android:drawable="@android:color/holo_blue_light" /> <item android:state_activated="true" android:drawable="@android:color/holo_blue_light" /> <item android:drawable="@android:color/transparent"/> </selector> 

Luego, en el diseño \ custom_row.xml

 <?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:padding="10dip" android:background="@drawable/row_background" android:orientation="vertical"> <TextView android:id="@+id/line1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

Para más información, estoy usando esto con el adaptador ListView, usando myList.setChoiceMode (ListView.CHOICE_MODE_MULTIPLE_MODAL); Y myList.setMultiChoiceModeListener (nuevo MultiChoiceModeListener () …

De este ejemplo: http://www.androidbegin.com/tutorial/android-delete-multiple-selected-items-listview-tutorial/

También, usted (debe) utilizar esta estructura para su acoplamiento de la lista-adaptador: List myList = new ArrayList ();

En lugar de: ArrayList myList = new ArrayList ();

Explicación: Lista de tipos vs tipo ArrayList en Java

Suponga que desea que se haga clic en cada elemento una vez. Entonces este código funciona bien. Tomemos el nombre de listview como stlist

 stList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override // here i overide the onitemclick method in onitemclick listener public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //color change //selected item colored for(int i=0; i<stList.getAdapter().getCount();i++) { stList.getChildAt(i).setBackgroundColor(Color.TRANSPARENT); } parent.getChildAt(position).setBackgroundColor(Color.GRAY); }); 

Este es un método simple que puede manejar la selección incluso si la lista es larga también:

 public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Holder holder=new Holder(); View rowView; rowView = inflater.inflate(R.layout.list_item, null); //Handle your items. //StringHolder.mSelectedItem is a public static variable. if(getItemId(position)==StringHolder.mSelectedItem){ rowView.setBackgroundColor(Color.LTGRAY); }else{ rowView.setBackgroundColor(Color.TRANSPARENT); } return rowView; } 

Y luego en tu onclicklistener:

 list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { StringHolder.mSelectedItem = catagoryAdapter.getItemId(i-1); catagoryAdapter.notifyDataSetChanged(); ..... 

Sé que esta es una vieja pregunta, pero le doy una solución simple para esta necesidad (sin bucles!):

 //On your adapter create a variable: private View lastSelectedItem; //Define the folowing method: private void toggleBackgroundItem(View view) { if (lastSelectedItem != null) { lastSelectedItem.setBackgroundColor(Color.TRANSPARENT); } view.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark)); lastSelectedItem = view; } //finally invoque the method onItemClick lvSac.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick (AdapterView < ? > adapterView, View view,int i, long l){ toggleBackgroundItem(view); } } 
  View updateview;// above oncreate method listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override `enter code here`public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (updateview != null) updateview.setBackgroundColor(Color.TRANSPARENT); updateview = view; view.setBackgroundColor(Color.CYAN); } }); 
  • Android TextView en texto BOLD y Normal
  • Cómo deshabilitar el desplazamiento de HorizontalScrollView dentro de ViewPager
  • cómo dar una animación curl página en un evento de clic de ImageButton
  • Vista de lista de Android dentro de una vista de desplazamiento
  • Uso de ShowcaseView con la aplicación v7 appcompat ActionBar
  • RecycleView roba el foco cuando está dentro de un NestedScrollView
  • Cómo agregar relleno alrededor de un WebView
  • ¿Cómo evitar los pesos anidados?
  • ¿Cómo puedo configurar el tamaño ProgressDrawable de un buscador personalizado para que sea más pequeño que el ProgressBackground
  • Uso de texto de Android como etiqueta y valor
  • Cómo extraer el texto del elemento seleccionado en el listView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.