2009-08-20 16 views
2

Ich benutze diesen Code, um das Element vom Cursor, aber es gibt nur einen Artikel auf meiner Liste. Also, wie kann ich alle Artikel auf meine Liste bekommen, das ist mein Code?Holen Sie sich alle Artikel von Cursor in Android

class MyAdapter extends SimpleCursorAdapter 
{ 
    private Context context; 

    public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) 
    { 
     super(context, layout, c, from, to); 
     this.context = context; 

    } 
    public View getView(int position, View convertView, ViewGroup parent){ 
     Cursor cursor = getCursor(); 

     LayoutInflater inflater = ((Activity) context).getLayoutInflater();   
     View v = inflater.inflate(R.layout.sbooks_row, null);   
     TextView title = (TextView)findViewById(R.id.title); 
     if(title != null){ 
      int index = cursor.getColumnIndex(SBooksDbAdapter.KEY_TITLE); 
      String type = cursor.getString(index); 
      title.setText(type); 
     } 

     TextView lyrics = (TextView)findViewById(R.id.lyrics); 
     if(lyrics != null){ 
      int index = cursor.getColumnIndex(SBooksDbAdapter.KEY_LYRICS); 
      String type = cursor.getString(index); 
      lyrics.setText(type); 
     } 

     ImageView im = (ImageView)findViewById(R.id.icon); 
     if(im!=null){ 
      int index = cursor.getColumnIndex(SBooksDbAdapter.KEY_FAVORITE); 
      int type = cursor.getInt(index); 
      if(type==1){ 
       im.setImageResource(android.R.drawable.btn_star_big_on); 
      } 
      else{ 
       im.setImageResource(android.R.drawable.btn_star_big_off); 
      } 
     } 

     return v; 
    } 

Antwort

5

Adapter Cursor verhält sich ein wenig anders als die anderen Liste Adapter - statt in getView(), die Magie in NewView geschieht hier() und Bindview(), so dass ich denke, getView() nicht die richtige ist Methode zum Überschreiben.

Sie können nur ein Ergebnis erhalten, da CursorAdapter nach dem Erstellen der ersten Zeile erwartet, dass bindView() neue Daten einfügt und die bereits aufgeblähte Zeile wieder verwendet, und Sie erwarten, dass getView() dies tut.

Ich schlage vor, Sie versuchen, Ihren Code nach NewView() zu verschieben, um Ihre Ansicht aufzublasen, und bindView(), um die eigentliche Logik zum Auffüllen der Zeilen auszuführen.

Viel Glück, und halten Sie uns über die Ergebnisse auf dem Laufenden.

+0

Hallo, ich versuche, meinen Code mit Ihrem Rat zu bearbeiten. Ich benutze newView(), bindView() - Funktionen, und es gibt alle Elemente zurück. Aber ich habe immer noch ein Problem in meinem Listview, es ist nicht wirklich normal. Ich meine, es wird anders angezeigt, wenn ich den Scollbar hoch und runter ziehe. Darf ich etwas vergessen haben? – Dennie

+0

Was meinen Sie, wenn die Artikel nicht normal angezeigt werden? Wenn Sie sehen, dass alte Elemente angezeigt werden, anstatt neuer (passiert mir mit normalem Adapter), sollte ein Problem mit Ihrer Recycling-Logik (bindView()) auftreten. PS.Ich würde Ihnen auch empfehlen, das ViewHolder-Muster zu verwenden, wie hier erklärt: http://www.youtube.com/watch?v=N6YdwzAvwOA um 0:09:02. –

+0

Dieser Video-Link ist sehr hilfreich für alle, die wissen wollen, was unter dem ListView passiert. Danke Dimitar! –

0

ich den Cursor durch die GetCursor() -Methode zurückgegeben bin vorausgesetzt korrekt alle Zeilen für Ihre Tabelle abruft, müssen Sie explizit den Cursor auf eine Position bewegen, bevor die Daten für eine Zeile zugreifen, so bei der Anfang Ihrer getView() -Methode, die Sie aufrufen müssen.

cursor.moveToPosition(position); 
+0

Es gibt immer noch einen Artikel zurück! Ich denke, es funktioniert hier nicht. – Dennie

Verwandte Themen