Cambiar el color de fondo del elemento seleccionado en un ListView

Resuelto KaHeL asked hace 54 años • 17 respuestas

Quiero saber cómo puedo cambiar el color de fondo del elemento seleccionado en mi listView. 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 usar la vista de lista predeterminada de Android, usé 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 alguna otra forma de evitarlo que pueda hacer y que dé el mismo resultado que obtuve.

Intenté usarrecord_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 elemento dibujable como lo dice la documentación "Dibujable utilizado para indicar el elemento actualmente seleccionado en la lista". También creo que esto debería funcionar y sí, funciona en mi emulador pero no en mi pestaña Galaxy. También probé los otros métodos pero nada funciona como quería.

KaHeL avatar Jan 01 '70 08:01 KaHeL
Aceptado

Puede realizar un seguimiento de 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í funcionó.

Esteam avatar Jun 07 '2013 07:06 Esteam

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

bkg.xml en la 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>

presionado.xml en la 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 la 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>

Establezca el fondo dibujable en el diseño personalizado de vista de lista que se inflará 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 listas en vista de lista como se muestra a continuación

   android:listSelector="@drawable/bkg" 
Raghunandan avatar Jun 07 '2013 05:06 Raghunandan

Definir variable

private ListView mListView;

Inicializar variable

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

OnItemClickListener de vista de lista

   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 - Listo

Hiren Patel avatar May 05 '2015 10:05 Hiren Patel

Método 1:

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

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

¡Eso es todo, ya terminaste!

Si desea una forma programática de manejar esto, utilice 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 vistas de lista 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);
    }
}
JMax avatar Jun 22 '2016 21:06 JMax