2010-11-26 39 views
5

Estoy tratando de mostrar información de Cursor en un , cada fila contiene un ImageView y un TextView. Tengo un CustomCursorAdapter extendiendo CursorAdapter, en bindView evalúo los datos del cursor y en base a eso establecí las vistas de la imagen y el texto.Cómo reemplazar CursorAdapter bindView

Cuando ejecuto la aplicación, el ListView muestra la cantidad correcta de filas, pero están vacías. Sé que me he perdido algo al anular bindView, pero no estoy seguro de qué.

Cualquier ayuda sería muy apreciada.

private class CustomCursorAdapter extends CursorAdapter { 

    public CustomCursorAdapter() { 
    super(Lmw.this, monitorsCursor); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    LayoutInflater layoutInflater = getLayoutInflater(); 

    return layoutInflater.inflate(R.layout.row, null); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
    try { 
     int monitorNameIndex = cursor.getColumnIndexOrThrow(DbAdapter.MONITORS_COLUMN_MONITOR_NAME); 
     int resultTotalResponseTimeIndex = cursor.getColumnIndexOrThrow(DbAdapter.RESULTS_COLUMN_TOTAL_RESPONSE_TIME); 

     String monitorName = cursor.getString(monitorNameIndex); 
     int warningThreshold = cursor.getInt(resultTotalResponseTimeIndex); 

     String lbl = monitorName + "\n" + Integer.toString(warningThreshold) + " ms"; 

     TextView label = (TextView) view.findViewById(R.id.label);  
     label.setText(lbl); 

     ImageView icon = (ImageView)view.findViewById(R.id.icon); 
     if(warningThreshold < 1000) { 
     icon.setImageResource(R.drawable.ok);  
     } else { 
     icon.setImageResource(R.drawable.alarm); 
     } 


    } catch (IllegalArgumentException e) { 
     // TODO: handle exception 
    } 
    } 
} 
+0

voy a tratar esto más adelante, pero 1 comentario: Usted debe hacer estos 'cursor.getColumnIndexOrThrow (DbAdapter.MONITORS_COLUMN_MONITOR_NAME);' llamadas en su constructor. ¿Qué hay de 'Log.e' la excepción? –

Respuesta

4

El método bindView() parece bien.

Trate de reemplazar su NEWVIEW() método:

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return mInflater.inflate(R.layout.row, parent, false); 
} 

Y, por razones de rendimiento:

  • movimiento getLayoutInflater() en el constructor
  • lo mismo con todas las cursor.getColumnIndexOrThrow() llamadas, como ened ya dicho en el
    comentarios
  • utilizan un StringBuilder para crear su LBL texto
  • no hay necesidad de hacer Integer.toString (warningThreshold) ... sólo tiene que utilizar warningThreshold

Posteriormente edición: La única diferencia entre su método inflate() y el que sugerí es que este crea parámetros de diseño que ch el padre.

+0

Resulta que el error estaba realmente en mi sql, la columna 'RESULTS_COLUMN_TOTAL_RESPONSE_TIME' no estaba en el cursor. Gracias por los comentarios sobre los problemas de rendimiento. Marcará su respuesta como correcta. – Holm

Cuestiones relacionadas