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