texto studio simple item color change cambiar android listview colors

studio - Cambiar el color de fondo de los elementos ListView en Android



listview android studio (17)

¿Quisiste cambiar el color de fondo de los elementos de lista personalizados cuando haces clic en él?

Si es así:

Simplemente agregue el siguiente código a su diseño de vista de lista en xml.

android: drawSelectorOnTop = "true" android: listSelector = "@ android: drawable / list_selector_background"

El selector de lista aquí usa el selector predeterminado que tiene un color gris oscuro. Puede hacer su propio dibujo y asignarlo al selector de lista como se indica arriba.

Espero que esto sea lo que querías.

¿Cómo puedo cambiar el color de fondo de los elementos de ListView por elemento? Cuando uso android:backgroundColor en el diseño del elemento ListView puedo lograr esto, sin embargo, el selector de lista ya no es visible. Puedo hacer que el selector sea visible nuevamente al establecer drawSelectorOnTop en verdadero, pero luego el selector sobrepone el ítem completo.

¿Alguna idea de cómo cambiar esos colores de fondo y mantener el selector?

PD Preferiría no cambiar el selector en sí.

EDITAR: los autores de la aplicación de GMail lograron exactamente esto, así que definitivamente es posible.


Al cambiar un código de Francisco Cabezas, obtuve lo siguiente:

private int selectedRow = -1; ... @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { parent.getChildAt(position).setBackgroundResource(R.color.orange); if (selectedRow != -1 && selectedRow != position) { parent.getChildAt(selectedRow).setBackgroundResource(R.color.black); } selectedRow = position;


Código simple para cambiar todo en el diseño del elemento (la vista de lista personalizada amplía el baseadapter):

lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { RelativeLayout layout=(RelativeLayout) arg1.findViewById(R.id.rel_cell_left); layout.setBackgroundColor(Color.YELLOW); } });


Debe crear un estado diferente dibujable para cada color que desee usar.

Por ejemplo: list_selector_read.xml y list_selector_unread.xml .

Todo lo que necesita hacer es configurar todo en transparente, excepto el elemento android:state_window_focused="false" .

Luego, cuando está dibujando su lista, llama a setBackgroundResource(R.drawable.list_selector_unread/read) para cada fila.

No configura un listSelector en el ListView en absoluto. Eso mantendrá el selector predeterminado para su sabor particular de Android.


Desde el código fuente de la aplicación de correo electrónico 2.2 de Android :

<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_window_focused="false" android:state_selected="true" android:drawable="@android:color/transparent" /> <item android:state_selected="true" android:drawable="@android:color/transparent" /> <item android:state_pressed="true" android:state_selected="false" android:drawable="@android:color/transparent" /> <item android:state_selected="false" android:drawable="@color/message_item_read" /> </selector>

Nada más que decir...


Eche un vistazo al ejemplo de List14 . En getView() puede llamar a convertView.setBackgroundDrawable() para cada entrada. Podrías tener un contador miembro de la clase para decidir con qué fondo llamar para obtener fondos alternativos, por ejemplo.


El mejor tutorial sobre esto se puede encontrar here .

Secciones clave:

  1. Seguramente llame a view.setSelected(true) en onItemClick , de lo contrario, no podrá ver el fondo del elemento seleccionado
  2. Preserve el orden de los estados en su selector; de lo contrario, verá un comportamiento impredecible en los colores de fondo ( state_selected seguido de state_pressed )

En la vista de lista, puede agregar android: listselector = nombre de color que desee.

esto funciona bien en mi aplicación.


Esta es una modificación basada en el código anterior, un código más simple:

private static int save = -1; public void onListItemClick(ListView parent, View v, int position, long id) { parent.getChildAt(position).setBackgroundColor(Color.BLUE); if (save != -1 && save != position){ parent.getChildAt(save).setBackgroundColor(Color.BLACK); } save = position; }

Espero que le sea útil

¡saludos!


Intenté todas las respuestas anteriores ... ninguna funcionó para mí ... esto es lo que funcionó eventualmente y se usa en mi aplicación ... proporcionará colores de elementos de la lista de lectura / no leída mientras se mantienen los estilos de selector de listas para ambos estados:

<ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="match_parent" android:listSelector="@drawable/selectable_item_background_general" android:drawSelectorOnTop="true" android:fadingEdge="none" android:scrollbarStyle="outsideOverlay" android:choiceMode="singleChoice" />

seleccionatable_item_background_general.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime"> <item android:state_pressed="false" android:state_focused="true" android:drawable="@drawable/bg_item_selected_drawable" /> <item android:state_pressed="true" android:drawable="@drawable/bg_item_selected_drawable" /> <item android:drawable="@android:color/transparent" /> </selector>

bg_item_selected_drawable.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#12000000" /> </shape>

notification_list_itemlayout.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rowItemContainer" android:layout_width="fill_parent" android:layout_height="wrap_content"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="8dp" android:paddingLeft="16dp" android:paddingStart="16dp" android:paddingRight="16dp" android:paddingEnd="16dp"> <ImageView android:id="@+id/imgViewIcon" android:layout_width="60dp" android:layout_height="60dp" android:src="@drawable/cura_logo_symbol_small" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginRight="8dp" android:layout_marginEnd="8dp" /> <TextView android:id="@+id/tvNotificationText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/imgViewIcon" android:layout_toRightOf="@+id/imgViewIcon" android:layout_toEndOf="@+id/imgViewIcon" android:textSize="@dimen/subtitle" android:textStyle="normal" /> <TextView android:id="@+id/tvNotificationTime" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:layout_below="@+id/tvNotificationText" android:layout_toRightOf="@+id/imgViewIcon" android:layout_toEndOf="@+id/imgViewIcon" android:textSize="@dimen/subtitle" /> </RelativeLayout> </RelativeLayout>

Finalmente, en tu adaptador:

if (!Model.Read) rowItemContainer.SetBackgroundColor (Android.Graphics.Color.ParseColor ("#FFFDD0")); // unread color else rowItemContainer.SetBackgroundColor (Android.Graphics.Color.White); // read color


Nadie parecía proporcionar ningún ejemplo de hacerlo solo usando un adaptador, así que pensé en publicar mi fragmento de código para mostrar ListViews donde el elemento "curSelected" tiene un fondo diferente:

final ListView lv = (ListView)findViewById(R.id.lv); lv.setAdapter(new BaseAdapter() { public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new TextView(ListHighlightTestActivity.this); convertView.setPadding(10, 10, 10, 10); ((TextView)convertView).setTextColor(Color.WHITE); } convertView.setBackgroundColor((position == curSelected) ? Color.argb(0x80, 0x20, 0xa0, 0x40) : Color.argb(0, 0, 0, 0)); ((TextView)convertView).setText((String)getItem(position)); return convertView; } public long getItemId(int position) { return position; } public Object getItem(int position) { return "item " + position; } public int getCount() { return 20; } });

Este siempre ha sido un enfoque útil para mí cuando la apariencia de los elementos de la lista debe cambiar dinámicamente.


Ok, lo tengo para trabajar así:

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

YMMV!


Puedes hacerlo.

final List<String> fruits_list = new ArrayList<String>(Arrays.asList(fruits)); // Create an ArrayAdapter from List final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_list_item_1, fruits_list){ @Override public View getView(int position, View convertView, ViewGroup parent){ // Get the current item from ListView View view = super.getView(position,convertView,parent); if(position %2 == 1) { // Set a background color for ListView regular row/item view.setBackgroundColor(Color.parseColor("#FFB6B546")); } else { // Set the background color for alternate row/item view.setBackgroundColor(Color.parseColor("#FFCCCB4C")); } return view; } }; // DataBind ListView with items from ArrayAdapter lv.setAdapter(arrayAdapter); }

}


Si se agrega setBackgroundColor para el evento onItemClick, no funcionará a menos que pueda colocarlo después del evento click.

Intente agregar código de depuración en el método getView del adaptador, encontrará que se llamará a getView cada vez que haga clic en la pantalla. Entonces, después de configurar el color de fondo, el sistema volverá a dibujar la pantalla con la configuración original. No sé por qué desperdicia recursos para reconstruir la pantalla cada vez que se está haciendo clic, ya existe otra forma de que podamos notificar al sistema para volver a dibujar la pantalla cuando sea necesario.

Tal vez pueda agregar un indicador de control para determinar el color de fondo de una fila individual, luego modifique el método getView para establecer el color de acuerdo con este indicador de control. Entonces, el color de fondo cambiará cuando vuelva a dibujar la pantalla.

También estoy buscando una solución oficial sobre eso.


la forma más fácil es esta. Dentro de su ListArrayAdapter solo haga esto

if(your condition here) rowView.setBackgroundColor(Color.parseColor("#20FFFFFF"));

no se complique demasiado


Siguiendo el camino muy lentamente en la carrera

mAgendaListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //view.setBackgroundColor(Color.RED); for(int i=0; i<parent.getChildCount(); i++) { if(i == position) { parent.getChildAt(i).setBackgroundColor(Color.BLUE); } else { parent.getChildAt(i).setBackgroundColor(Color.BLACK); } }

Reemplazado por el siguiente

int pos = 0; int save = -1; @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //Always set the item clicked blue background view.setBackgroundColor(Color.BLUE); if (pos == 0) { if (save != -1) { parent.getChildAt(save).setBackgroundColor(Color.BLACK); } save = position; pos++; Log.d("Pos = 0", "Running"); } else { parent.getChildAt(save).setBackgroundColor(Color.BLACK); save = position; pos = 0; Log.d("Pos # 0", "Running"); }


mAgendaListView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //view.setBackgroundColor(Color.RED); for(int i=0; i<parent.getChildCount(); i++) { if(i == position) { parent.getChildAt(i).setBackgroundColor(Color.BLUE); } else { parent.getChildAt(i).setBackgroundColor(Color.BLACK); } }