2010-12-23 10 views
1

Ich habe eine Listview, die ihre Daten aus SQLite-Datenbank lädt. Jede Zeile in der Listenansicht enthält ein Bild, eine Textansicht und ein Kontrollkästchen. Die sqlitedatabase-Zeilen enthalten Bild- und Textdaten und einige andere Spalten.Binding Listview Zeile mit SQLite-Datenbank für benutzerdefinierte Zeilen

Meine Frage ist, kann ich meine Listview mit der Datenbank binden, so dass alle Zeilen automatisch mit erforderlichen Daten geladen werden. (Bild + Textansicht) Es gibt Beispiele, um eine einfache Liste von Textansichten zu binden. Was ist mit komplexen Reihen? Außerdem gibt es wenige Spinner, die die Daten in der Liste abhängig von ihrem Wert filtern können. (Was als eine WHERE-Klausel in meiner Datenbank)

Derzeit ich alle dies durch die Generierung der Ansicht für meinen benutzerdefinierten Adapter für jede Zeile verwalten. Also jedes Mal, wenn ich Datenbank abfrage und Daten bevölkere. Ich halte die letzten Listview-Ergebnisse, mache eine neuere Ergebnisse basierend auf Aktionen/Bedingungen wie Spinner-Werte, dann notifydatangeändert an Adapter, um meine neuen Ergebnisse zu laden.

Um Funktionen wie LÖSCHEN, HINZUFÜGEN, SUCHEN hinzuzufügen - ich muss alles mit Sammlungen verwalten.

Gibt es eine einfache Möglichkeit, dies zu tun? Als ob die db groß ist, ist der Ansatz, so große Mengen von Ergebnissen im Speicher zu halten, nicht gut. Und es ist schmerzhaft, es zu verwalten. Danke.

+0

und eine Frage zu erwähnen, wenn Sie eine Checkbox in der Listview-Zeile hinzufügen, können Sie Erhalten Sie kein Klickereignis für Listenelemente. Sie müssen den einzelnen Ansichten in der Zeile Listener hinzufügen. Wie bekommt man einen normalen Klick auf ein Listenelement? – Pritam

Antwort

2

Hier ist mein Beispiel für Reihe, von zwei Datensatz aus db + Bild konstruiert (bei Strom - ein Bild für jede Reihe, aber es kann für bestimmtes Bild von dB verbessert werden):

public class DomainAdapter extends SimpleCursorAdapter{ 
    private Cursor dataCursor; 

    private LayoutInflater mInflater; 
    .... 

    public DomainAdapter(Context context, int layout, Cursor dataCursor, String[] from, 
      int[] to) { 
     super(context, layout, dataCursor, from, to); 
      this.dataCursor = dataCursor; 
      mInflater = LayoutInflater.from(context); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     // A ViewHolder keeps references to children views to avoid unneccessary calls 
     // to findViewById() on each row. 
     ViewHolder holder; 

     // When convertView is not null, we can reuse it directly, there is no need 
     // to reinflate it. We only inflate a new View when the convertView supplied 
     // by ListView is null. 
     if (convertView == null) { 
      convertView = mInflater.inflate(layout, null); 

      // Creates a ViewHolder and store references to the two children views 
      // we want to bind data to. 
      holder = new ViewHolder(); 
      holder.text1 = (TextView) convertView.findViewById(R.id.test_track); 
      holder.text2 = (TextView) convertView.findViewById(R.id.test_band); 
      holder.icon = (ImageView) convertView.findViewById(R.id.test_artwork); 

      convertView.setTag(holder); 
     } else { 
      // Get the ViewHolder back to get fast access to the TextView 
      // and the ImageView. 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     // Bind the data efficiently with the holder. 
     // Cursor to current item 
     dataCursor.moveToPosition(position); 
     int title_index = dataCursor.getColumnIndex(fields[0]); 
     String title = dataCursor.getString(title_index); 

     int description_index = dataCursor.getColumnIndex(fields[1]); 
     String description = dataCursor.getString(description_index); 

     holder.text1.setText(title); 
     holder.text2.setText(description); 
     holder.icon.setImageResource(R.drawable.alert_dialog_icon); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView text1; 
     TextView text2; 
     ImageView icon; 
    } 
} 

und unter Verwendung von dieser Adapter:

databaseListAdapter = new DomainAdapter(this, 
       R.layout.test_layout, 
       databaseCursor, 
       new String[] {"title", "description"}, 
       new int[] { R.id.test_track, R.id.test_track }); 
databaseListAdapter.notifyDataSetChanged(); 
DomainView.setAdapter(databaseListAdapter); 

und Layout:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="64dip" 
    android:padding="6dip"> 

    <TextView 
     android:id="@+id/test_band" 
     android:layout_width="fill_parent" 
     android:layout_height="26dip" 

     android:layout_below="@+id/test_track" 
     android:layout_alignLeft="@id/test_track" 
     android:layout_alignParentBottom="true" 

     android:gravity="top" /> 

    <TextView 
     android:id="@id/test_track" 
     android:layout_marginLeft="6dip" 
     android:layout_width="fill_parent" 
     android:layout_height="26dip" 

     android:layout_toRightOf="@+id/test_artwork" 

     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:gravity="bottom" /> 

    <ImageView 
     android:id="@id/test_artwork" 
     android:layout_width="56dip" 
     android:layout_height="56dip" 
     android:layout_gravity="center_vertical" /> 

</RelativeLayout> 
+0

Hallo, können Sie weiter auf Ihr Beispiel erweitern. Ich bin mir nicht sicher, wie ich die "Daten" verwenden soll. Variable. Thnx! – CelticParser

+0

Es tut mir sehr leid! Als ich diesen Code geschrieben habe, habe ich einige Variablen umbenannt. Daten - ist der Cursor. Ich habe Fehler behoben, danke für die Frage. –

+0

Thnx! @Anton Derevyanko – CelticParser

0

Meine Frage ist, kann ich band meine Listview mit der Datenbank, so dass alle Zeilen mit erforderlichen Daten automatisch geladen werden. (image + textview) Es gibt Beispiele zum Binden einer einfachen Liste von Textansichten. Was ist mit komplexen Zeilen?

Ja, können Sie Ihre eigenen CursorAdapter durch die Implementierung und das Überschreiben der bindView() eine Cursor zu komplexen Ansicht Mapping tun.

+0

Es ist nicht notwendig, 'CursorAdapter' zu verlängern; Sie können einen 'ViewBinder' hinzufügen, um mehr oder weniger den gleichen Effekt wie das Überschreiben von' bindView' zu erreichen. Ich habe einen aktuellen Blog-Post mit einem Beispiel-ViewBinder. (Im Beispiel werden 'Spinner' und' SimpleAdapter' verwendet, aber die Technik sollte mit 'ListView' und' SimpleCursorAdapter' funktionieren.) Siehe http://www.outofwhatbox.com/blog/2010/12/android-spinners-simpleadapter -und-vielleicht-viewbinder/ –

Verwandte Themen