2010-12-10 5 views
1

Ich habe eine Aktivität, wo ich Ergebnisse von einer Datenbank mit ListView anzeigen möchte. Die Tabelle besteht aus drei Spalten: Wort, Beschreibung und Kategorie. Auf der Aktivitätsseite habe ich eine Liste von Kategorien, die von einem Array gelesen werden. Ich möchte es so einrichten, dass, wenn Sie auf ein Element in der Liste klicken (zum Beispiel Kat1), die vom Cursor zurückgegebenen Ergebnisse alle Wörter/Beschreibungen mit der Kategorie Kat1 im DB sind. Derzeit habe ich einfach einen Toast mit dem Namen dieser Kategorie angezeigt, wenn Sie darauf klicken.Cursor Ergebnisse von DB in ListView nach OnItemClick anzeigen

Wie es jetzt ist, wird die Aktivität nicht ordnungsgemäß ausgeführt. Ich habe im Internet gelesen und bin mir nicht sicher, wie es weitergehen soll. Hier ist der Code, den ich bisher habe. Wenn mir jemand helfen kann, würde ich es sehr schätzen.

Öffentliche Klasse Kategorien erweitert ListActivity { DataBaseHelper db = new DataBaseHelper (this); private SQLiteDatabase-Daten; int position;

private ListView list; 
private String[] categories = { 
    "C1", "C2", "C3", "C4", 
    "C5", "C6", "C7", "C8", 
    "C9", "C10", "C11", "C12" 
}; 

@Override 
public void onCreate(Bundle icicle){ 
    super.onCreate(icicle); 
    setContentView(R.layout.cat_list); 

    list = (ListView)findViewById(R.id.cat_listing); 
    list.setAdapter(new ArrayAdapter<String>(this, 
     R.layout.categories, categories)); 
    list.setTextFilterEnabled(true); 

    Cursor cursor = data.rawQuery("SELECT term, desc FROM words WHERE cat = '" + categories[position] + "'", null); 
    startManagingCursor(cursor); 

    String columns[] = new String[] { "term", "desc" }; 
    int[] to = new int[] { R.id.cat_term, R.id.cat_desc }; 

    SimpleCursorAdapter myAdapter = new SimpleCursorAdapter(this, R.layout.cat_result, cursor, columns, to); 
    this.setListAdapter(myAdapter); 

    list.setOnItemClickListener(new OnItemClickListener(){ 

     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id){ 
      CharSequence text = categories[position]; 
      Toast toast = Toast.makeText(getApplicationContext(), 
        text, Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    }); 
} 

}

Antwort

4

Ich habe eine ähnliche Funktion in meiner app. Sie müssen eine XML-Datei erstellen, um das Layout für die Liste zu definieren und sie in Ihrem Java-Code aufzurufen. Hier

ist das Beispiel XML:

LIST:

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:orientation="vertical" > 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" > 
    </ListView> 
    <TextView 
     android:id="@+id/android:empty" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:text="@string/no_projects" 
     android:padding="10dp" 
     android:textSize="16sp" 
     android:textStyle="bold" > 
    </TextView> 
</LinearLayout> 

Dies ist das benutzerdefinierte Layout XML. Ich nenne es list_rows:

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:orientation="vertical" > 
    <TextView 
     android:id="@+id/text1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    </TextView> 
    <TextView 
     android:id="@+id/text2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    </TextView> 
    <TextView 
     android:id="@+id/text3" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    </TextView> 
</LinearLayout> 

Und dies ist der JAVA-Code:

String[] fields = new String[] { db.TABLE_PRJ_NAME, db.TABLE_PRJ_TYPE, db.TABLE_PRJ_DESC }; 
    int[] views = new int[] { /*android.R.id.text1*/ R.id.text1, R.id.text2, R.id.text3 }; 

    c = db.getAllProjects(); 
    startManagingCursor(c); 

    // Set the ListView 
    SimpleCursorAdapter prjName = new SimpleCursorAdapter(
      this, 
      R.layout.project_list_rows, 
      //android.R.layout.simple_list_item_1, 
      c, fields, views); 
    setListAdapter(prjName); 

Die onListItemClickListener

// This section of code is for handling the Click Event of the Projects List 
@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    Cursor o = (Cursor) this.getListAdapter().getItem(position); 
    String projectName = o.getString(1); 

    Intent showProjectDetails = new Intent(this, ProjectDetails.class); 
    Bundle bundle = new Bundle(); 

    bundle.putString("sendProjectName", projectName); 

    showProjectDetails.putExtras(bundle); 
    startActivity(showProjectDetails); 
} 

Was der neue Teil des Codes tun, ist nur das ausgewählte Element zu senden zu einer anderen Aktivität durch eine Absicht. Dann frage ich in der neuen Aktivität den DB unter Verwendung des ausgewählten Elementnamens aus dem Bündel und zeige das Ergebnis an.

Fragen Sie, wenn Sie weitere Erläuterungen benötigen.

+0

Siddharth, Das ist, was ich bereits habe, wenn Sie meinen Code angesehen haben.Ich habe Probleme damit, dass dieser Code ohne Fehler ausgeführt wird, während ich mache, was ich getan habe. Können Sie die gesamte Quelle anstatt eines Auszuges posten? Verwenden Sie sogar OnItemClick? Danke ... – Devin

+0

Hinzufügen des zusätzlichen Codes. Überprüfen Sie den ursprünglichen Beitrag. –

+0

Es tut mir wirklich leid, aber ich habe Probleme hier. Ich verstehe, was bei der Vorbereitung des Cursors und bei der Erstellung eines SimpleCursorAdapters eine Rolle spielt. Ich möchte jedoch keine neue Aktivität. Ich möchte es so, wenn jemand auf ein Element in der Liste klickt, wird es die Datenbank abfragen und eine Liste aller Wörter in der Kategorie zurückgeben, auf die geklickt wurde. Ich habe den Code, den Sie gepostet haben, ausprobiert, und am Ende muss ich gezwungen werden, den Vorgang zu beenden, wenn ich diese Aktivität öffne (ich kann nicht einmal zur Kategorie-Liste gelangen, um zu testen). Der Code, den ich oben geschrieben habe, funktioniert, wenn Sie die SimpleCursorAdapter-Deklaration und den SetListAdapter-Aufruf in der nächsten Zeile entfernen. – Devin

0

Ich mache ein sehr ähnliches Programm. Ich habe Probleme damit als mein erstes Programm für Android/Java. Welche Hilfe ich habe, ist vom Netz und meinem Stiefvater, die Java unterrichten.

Als ich bei der Einrichtung einer Datenbank half, erklärte er, meine Tabellen so einzurichten, dass Kategorien mit darunter liegenden Elementen gepaart werden. Sie haben also eine Tabelle für Ihre Kategorien, einschließlich des Titels, den Sie für diese Kategorie anzeigen, sowie Ihres Primärschlüssels. Dann brauchen Sie einen Tisch für die nächste Ebene von der Kategorie, sagen wir Titel. Dies würde einen Text für Titel und Primärschlüssel enthalten. Als nächstes müssen Sie eine weitere Tabelle erstellen, um sie zu paaren. Ein Titelschlüssel, ein Kategorieschlüssel und ein Primärschlüssel.

Von dort müssen Sie Java sagen, um sie auf der letzten Tabelle zu paaren.

Ich bin ein Noob so tut mir leid, ich könnte nicht mehr/bessere Informationen geben. Aber alles, was ich zu diesem Thema finde, poste ich hier und viel Glück.

Verwandte Themen