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 lista Vista. Solo quiero cambiar el elemento específico en el que hizo clic el usuario, lo que significa que si el usuario hace clic en otro elemento, será el que esté resaltado. Bueno, como quiero que sea lo más simple posible y use la vista de lista android predeterminada, usé este código:

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 funciona, pero el problema es que es lento. Ahora quiero saber si hay otra manera de hacerlo que pueda dar el mismo resultado que hice.

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

También probé el selector.xml pero tampoco funcionó. Además, hay una propiedad aquí en ListView que se llama listSelector. Es un dibujante como lo dice la documentación “Drawable utilizado para indicar el elemento seleccionado actualmente en la lista”. También creo que esto debería ser el truco y sí, funciona bien en mi emulador pero no en mi pestaña de galaxias. También probé los otros métodos, pero nada funciona como yo quería.

Puede seguir la posición del elemento seleccionado actual:

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

Y anule 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í, fue el truco.

Puedes usar un selector. Cambie los valores de los colores y modifique los siguientes según sus necesidades.

bkg.xml en una carpeta dibujable

 < ?xml version="1.0" encoding="utf-8"?>     

pressed.xml en una carpeta dibujable

 < ?xml version="1.0" encoding="UTF-8"?>   // color  // border    

normal.xml en la carpeta dibujable

 < ?xml version="1.0" encoding="UTF-8"?>       

Establecer el fondo dibujable para el diseño personalizado de la vista de lista para inflarse para cada fila

Recomiendo usar una vista de lista personalizada con un adaptador personalizado.

  android:background="@drawable/bkg" 

Si no ha utilizado un adaptador personalizado, puede configurar el selector de lista para mostrar como se muestra a continuación

  android:listSelector="@drawable/bkg" 

Definir variable

 private ListView mListView; 

Inicializar la 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); } } } }); 

Construye y ejecuta el proyecto - Hecho

Si desea que el elemento permanezca resaltado después de haber hecho clic en él, debe configurarlo manualmente como seleccionado en el oyente onItemClick.

Lista de Android El elemento seleccionado permanece resaltado :

 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"?>       

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

 < ?xml version="1.0" encoding="utf-8"?>           

Y luego en su vista de lista especifique el fondo como

 android:background="@drawable/list_item_selector" 

Método 1:

Actualice ListView en su actividad / fragmento de diseño xml:

  

Eso es todo, ¡listo!

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

Método 2:

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

Tenga en cuenta que esto solo funciona en listas que caben en una 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); } } 

Para aquellos que se preguntan qué se debe hacer EXACTAMENTE para mantener las filas seleccionadas incluso mientras se desplaza hacia abajo. Es el estado_activado El rest se ocupa de la funcionalidad interna, no tiene que preocuparse por alternar y puede seleccionar varios elementos. No necesité utilizar los métodos notifyDataSetChanged () o setSelected (true).

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

 < ?xml version="1.0" encoding="utf-8"?>         

Luego, en layout \ custom_row.xml

 < ?xml version="1.0" encoding="utf-8"?>    

Para obtener 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/

Además, debe (debería) usar esta estructura para su acoplamiento de adaptador de lista: List myList = new ArrayList ();

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

Explicación: Lista de tipos frente a tipo ArrayList en Java

Utilice el siguiente xml como fondo de lista de temas para resolver todos los problemas. El seleccionado se resaltará aunque se haya desplazado hacia abajo.

 < ?xml version="1.0" encoding="utf-8"?>     

Gracias, Nagendra

También estoy haciendo lo mismo: resalte el fondo del elemento de la lista seleccionada (cámbielo a rojo) y establezca el color del texto en blanco.

Puedo pensar en una forma ” simple 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 color del fondo y el texto del elemento seleccionado 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 por un tiempo, descubrí que muchas personas mencionaron establecer android:listSelector="YOUR_SELECTOR" . Después de probar por un tiempo, encontré que la manera más sencilla de resaltar el fondo del elemento ListView seleccionado se puede hacer con solo dos líneas establecidas en 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.

La forma más simple que he encontrado:

en su actividad XML agregue estas líneas:

  

o establezca programáticamente estas propiedades:

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

Mi ejemplo particular:

   

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

Sé que esta es una vieja pregunta, pero ofrezco 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); } } 

supongamos que quiere que se haga clic en un elemento cada vez. Entonces este código funciona bien. Tomemos el nombre 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 

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(); ..... 
  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); } }); 

En un conjunto ListView:

 android:choiceMode="singleChoice" 

Crea un selector para un fondo (drawable / selector_gray.xml):

 < ?xml version="1.0" encoding="utf-8"?>     

Agregue un artículo para una lista:

 < ?xml version="1.0" encoding="utf-8"?>  

En un ViewHolder puedes inflar este artículo.