Esta pregunta es un poco diferente de otras de un título similar. No estoy tratando de actualizar los datos en la lista, estoy tratando de actualizar el mira de la lista.¿Cómo forzar el redibujado de listview?
Mi aplicación está basada en fragmentos utilizando la biblioteca de soporte. Tengo una actividad de preferencia donde le permito al usuario configurar los colores que desea para el texto en una lista (el adaptador lee las preferencias y establece los colores). Esto funciona como se espera en su mayor parte.
El problema que estoy teniendo es el siguiente. Cuando tengo la lista en la pantalla (es un Fragmento de lista) y abro el menú, seleccione Preferencias y realice un cambio en la preferencia de color. Al regresar a la lista de PreferenceActivity, parece que no puedo obtener la lista para volver a dibujar con el nuevo color especificado.
Si salgo de la lista y vuelvo a ella, se regenera con el nuevo color.
Estoy tratando de usar onResume
para hacer el cambio. El código actualmente tengo (que no parece hacer nada a la lista, pero cambia el color de cabecera como debería):
@Override
public void onResume() {
super.onResume();
header.setTextColor(MyApplication.header);
line.setBackgroundColor(MyApplication.header_line);
subheader.setTextColor(MyApplication.header);
getListView().invalidateViews();
}
He tratado invalidateViews
y invalidate
. En mi desesperación intenté llamar al notifyDataSetChanged
en el adaptador, aunque no hubo ningún cambio en los datos. Nada parece funcionar.
¿Me falta algo obvio, o no hay forma de hacerlo?
EDITAR
El 'método getView` de mi adaptador:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = View.inflate(context, layout, null);
View row = convertView;
c.moveToPosition(position);
TextView first = (TextView) convertView.findViewById(R.id.ListItem1);
TextView second = (TextView) convertView.findViewById(R.id.ListItem2);
TextView third = (TextView) convertView.findViewById(R.id.ListItem3);
TextView fourth = (TextView) convertView.findViewById(R.id.ListItem4);
DecimalFormat df = new DecimalFormat("0.00");
Double hold = Double.valueOf(c.getString(3));
Double qty = Double.valueOf(c.getString(1));
Double total = hold * qty;
String color = "#FF00FF";
first.setText(c.getString(2));
first.setTextColor(MyApplication.shoplistitem_name);
second.setText(c.getString(4));
second.setTextColor(MyApplication.shoplistitem_desc);
third.setText(c.getString(1));
third.setTextColor(MyApplication.shoplistitem_qty);
fourth.setText("$" + df.format(total));
fourth.setTextColor(MyApplication.shoplistitem_desc);
if (strikethroughState[position] == 1) {
first.setPaintFlags(first.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
second.setPaintFlags(second.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
third.setPaintFlags(third.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
fourth.setPaintFlags(third.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
row.setBackgroundColor(MyApplication.shoplistitem_checked);
} else {
first.setPaintFlags(first.getPaintFlags()
& ~Paint.STRIKE_THRU_TEXT_FLAG);
second.setPaintFlags(second.getPaintFlags()
& ~Paint.STRIKE_THRU_TEXT_FLAG);
third.setPaintFlags(third.getPaintFlags()
& ~Paint.STRIKE_THRU_TEXT_FLAG);
fourth.setPaintFlags(third.getPaintFlags()
& ~Paint.STRIKE_THRU_TEXT_FLAG);
row.setBackgroundResource(R.color.black);
}
return (row);
}
Bueno ... esto señaló el camino para que yo encuentre el problema ... y me siento increíblemente estúpido. Estaba llamando 'MyApplication.setPreferences'. El método es 'MyApplication.setPrefs'. *suspiro* – Barak