2012-06-20 14 views
5

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); 
} 

Respuesta

7

notifyDataSetChanged() sin duda debería estar trabajando para usted. ¿Cómo manejas el cambio de preferencia? Si solo está asignando la preferencia a SharedPreferences, nunca actualizará la variable estática de MyApplication. ¿Puedes publicar el código que estás usando para establecer la preferencia? Si no lo está usando, configure onPreferenceChangedListener() para la preferencia de color para establecer esa variable estática cuando se modifique.

+1

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

1

Debe llamar notifyDataSetChanged() en su adaptador.

+3

¿Echas de menos la parte en mi publicación donde dije que lo intenté y no funcionó? Lo intenté de nuevo, lo mismo. Sin redibujar las vistas. – Barak

+0

puede publicar su método getView() desde el adaptador? – Gallal

+0

Pregunta editada para agregar el método 'getView'. – Barak

0

Invalidar, invalidateviews, notifyDatasetChanged, ¡nada funcionó para mí! para actualizar sólo la vista de lista (con CursorAdapter) acabo de hacer:

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); //optional, initial query 
adapter.changeCursor(cur); // or swapCursor(), cur is the initial and the only cursor 

Pero para tener el color fondos correcta, estirable, subrayar el texto, acabo de hacer:

cur = db.rawQuery("SELECT * FROM ssnt WHERE mid = 1000"); 
adapter.changeCursor(cur); 
list.setAdapter(adapter); //just like I did oncreate 

no me gusta solución Barak Porque parece pesado y ejecuta código cuando no es necesario.

Cuestiones relacionadas