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:
- Seguramente llame a
view.setSelected(true)
enonItemClick
, de lo contrario, no podrá ver el fondo del elemento seleccionado - Preserve el orden de los estados en su selector; de lo contrario, verá un comportamiento impredecible en los colores de fondo (
state_selected
seguido destate_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);
}
}