2010-11-26 21 views
5

Ich versuche, Informationen von einem Cursor in einem ListView anzuzeigen, jede Zeile enthält einen ImageView und einen TextView. Ich habe eine CustomCursorAdapter Erweiterung CursorAdapter, in bindView Ich werte die Daten aus dem Cursor und basierend darauf die Ansichten Bild und Text.Wie überschreiben CursorAdapter bindView

Wenn ich die App ausführen zeigt die ListView die richtige Anzahl von Zeilen, aber sie sind leer. Ich weiß, dass ich beim Überschreiben von BindView etwas übersehen habe, aber ich bin mir nicht sicher, was.

Jede Hilfe würde sehr geschätzt werden.

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

Ich werde das später versuchen, aber 1 Kommentar: Sie sollten diese 'cursor.getColumnIndexOrThrow (DbAdapter.MONITORS_COLUMN_MONITOR_NAME);' Aufrufe in Ihrem Konstruktor. Wie wäre es mit dir 'Log.e' die Ausnahme? –

Antwort

4

Die bindView() Methode scheint in Ordnung.

Versuchen Sie NewView ersetzen() Methode:

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

Und aus Performance-Gründen:

  • bewegen getLayoutInflater() im Konstruktor
  • gleiche Sache mit allen cursor.getColumnIndexOrThrow() Anrufe, als ened bereits in dergesagt Kommentare
  • einen Stringbuilder verwenden für Ihre LBL Text
  • zu schaffen gibt es keine Notwendigkeit Integer.toString (warningThreshold) zu tun ... nur warningThreshold

Später bearbeiten verwenden: Der einzige Unterschied zwischen Ihrer inflate() Methode und der, die ich vorgeschlagen habe, ist, dass diese Layout-Parameter erstellt, die mat ch das Elternteil.

+0

Stellt sich heraus, der Fehler war tatsächlich in meinem SQL, die Spalte 'RESULTS_COLUMN_TOTAL_RESPONSE_TIME' waren nicht im Cursor. Danke für das Feedback zu den Leistungsproblemen. Wird deine Antwort als richtig markieren. – Holm

Verwandte Themen