Android: ¿Los elementos de las listas no se vuelven naranjas cuando se hace clic?
Tengo un ListView
en el código de mi aplicación, que cuando se hace clic utiliza un AdapterView.OnItemClickListener
para detectar clics. El problema es que al hacer clic en un elemento, el fondo del elemento se convierte en blanco, en lugar del color naranja predeterminado. Me gusta esto:
Además, cuando no uso AdapterView, los elementos que se hacen clic en naranja sin ningún problema. ¿Cómo hago para que el fondo del elemento hecho clic sea naranja de nuevo?
- Android, usando SimpleCursorAdapter para establecer el color no sólo las cadenas
- Android Descargar varios archivos y mostrar el progreso en ListView
- Inflar diseño en ListItem basado en la variable específica ListItem
- Deslizar para eliminar listview muestra artefactos
- Mostrar la barra inferior de botones en ListView mientras se desplaza hacia arriba y se oculta cuando se desplaza hacia abajo
EDITAR:
Diseño de la lista: main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" android:background="#00000000"> <!-- ListView (grid_items) --> <ListView android:id="@+id/listview" android:layout_height="fill_parent" android:textSize="15px" android:layout_width="fill_parent" android:background="#00000000"> </ListView> </RelativeLayout>
OnCreate ():
public void onCreate(Bundle savedInstanceState) {try{ super.onCreate(savedInstanceState); setContentView(R.layout.main); lv= (ListView)findViewById(R.id.listview); lv.setBackgroundColor(Color.TRANSPARENT); lv.setCacheColorHint(Color.TRANSPARENT); //......calculations for(int q = 0; q <v; q++){ HashMap<String, String> map = new HashMap<String, String>(); map.put("col_1", array[q]); fillMaps.add(map); lv.setOnItemClickListener(onListClick); } //......calculations }
AdapterView:
private AdapterView.OnItemClickListener onListClick=new AdapterView.OnItemClickListener(){ public void onItemClick(AdapterView<?> parent,View view, int position, long id) { lv.setBackgroundColor(Color.TRANSPARENT); lv.setCacheColorHint(Color.TRANSPARENT); //.....calculations }
Tema personalizado que se utiliza:
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CustomWindowTitleBackground"> <item name="android:background">#323331</item> </style> <style name="CustomTheme" parent="android:Theme"> <item name="android:windowTitleSize">35dip</item> <item name="android:windowTitleBackgroundStyle">@style/CustomWindowTitleBackground</item> </style> </resources>
- Crear un menú después de un evento de clic largo en una vista de lista
- Más de 1 Urls diferentes y sólo One listview
- No se puede obtener el número de fila que se ha hecho clic en la vista de lista de android
- Cómo actualizar dinámicamente un ListView en Android
- Cómo evitar que el botón dentro de ListItem obtener resaltar
- Android lista ver espacio extra al final cuando se desplaza
- TextView`s LinkMovementMethod bloquea el evento de toque listitem
- Android Checkbox listview seleccionar todo (desactivar / activar)
La mejor manera de personalizar elementos de vista de lista es crearlos en un archivo xml y, a continuación, utilizando un adaptador BaseAdapter o cualquier otro tipo de adaptador de lista, infle ese diseño .xml y rellene los datos. Para personalizar una animación de relieve, todo lo que necesita es crear un estado Drawable para los diferentes estados de un elemento.
Así que ir a un "Nuevo archivo xml" -> "tipo de recurso dibujable" -> "forma" nombre y terminar verá este pedazo de código:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > </shape>
Vamos a crear un fondo para un estado pulsado ListItem:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#86d47f" this is your custom color /> </shape>
Y estado no prensado es otro archivo:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#00000000" /> </shape>
A continuación, un archivo selector de listas que se utilizará como fondo de un elemento de vista de lista: vaya a "nuevo archivo xml" -> "dibujable" -> "selector de lista" nombre como "item_background" -> finish
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="300" !!this is the fade duration time for your animation> <item android:drawable="@drawable/bg_drawable" android:state_pressed="true"></item> <item android:drawable="@drawable/transparend"></item> </selector>
A continuación, crear un archivo xml para un elemento, personalizarlo como desee, pero para el conjunto de diseño principal
android:background="@drawable/item_background"
Aquí tienes, todo funciona perfecto … aquí está mi clase de adaptador:
public class ListAdapter extends ArrayAdapter<String> { LayoutInflater inflater; public ListAdapter(Context context, int textViewResourceId, List<String> objects) { super(context, textViewResourceId, objects); inflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { String str_value = this.getItem(position); if (convertView == null) { convertView = inflater.inflate(R.layout.list_item, null); } TextView tv = (TextView) convertView.findViewById(R.id.textView1); tv.setText(str_value); return convertView; } }
Y aquí estás, supongo que lo marcarás como una respuesta ..
Así que una solución simple es hacer que el color de la visión esté en el onClicklistenener sí mismo:
private AdapterView.OnItemClickListener onListClick=new AdapterView.OnItemClickListener(){ public void onItemClick(AdapterView<?> parent,View view, int position, long id) { lv.setBackgroundColor(Color.TRANSPARENT); lv.setCacheColorHint(Color.TRANSPARENT); // I added this if(is the item checked ){ view.setBackgroundColor(Color.BLUE); //or whatever }else{ view.setBackgroundColor(00000000); } //.....calculations }
Tendrá que mantener la información sobre el tiempo que el elemento está marcado o no.
Si usted no desea usar el onClickListener pero sólo utiliza estilos (que podría ser la forma preferible), no puedo ayudarle furher por el momento.
Edit: Por cierto, no puedo ver por qué yout hacer esto en onClickListener on cada vez:
lv.setBackgroundColor(Color.TRANSPARENT); lv.setCacheColorHint(Color.TRANSPARENT);
Espero que esto ayude de todos modos.
Pruebe esto para configurar cualquier selector personalizado:
En 'styles.xml' crea este estilo:
<style name="MyList"> <item name="android:drawSelectorOnTop">true</item> <item name="android:listSelector">@drawable/my_list_selector</item> </style>
Y en su diseño simplemente añada este estilo al ListView:
<ListView .... style="@style/MyList" .... />
Y en 'drawable' puede definir el 'my_list_selector' con el color o la imagen deseada:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape> <solid android:color="@color/state_pressed" /> </shape> </item> <item android:state_focused="true"> <shape> <solid android:color="@color/state_focused" /> </shape> </item> <item android:drawable="@android:color/transparent" /> </selector>
Agregue estos valores de color a su 'colors.xml':
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="state_pressed">#BB7dbcd3</color> <color name="state_focused">#777dbcd3</color> <color name="transparent">#00000000</color> </resources>
Tenía un archivo llamado list_selector_background_longpress.9
dentro de mi carpeta list_selector_background_longpress.9
, que tenía una foto blanca con una línea anaranjada en la parte superior. Así que lo cambié con una imagen de color holo_orange_dark
, y eso lo resolvió. Qué solución tan estúpidamente simple para un problema así.