2010-12-10 36 views
1

J'ai une activité où je veux qu'il affiche les résultats d'une base de données en utilisant ListView. Le tableau comporte trois colonnes: mot, description et catégorie. Sur la page d'activité, j'ai une liste de catégories lues dans un tableau. Je veux le configurer de sorte que si vous cliquez sur un élément de la liste (par exemple Cat1), les résultats renvoyés par le curseur seront tous les mots/descriptions avec la catégorie Cat1 dans la base de données. Actuellement, j'ai simplement un toast avec le nom de cette catégorie apparaît lorsque l'on clique dessus.Affichage des résultats du curseur de DB dans ListView après OnItemClick

Comme c'est le cas actuellement, l'activité ne fonctionne pas correctement. J'ai lu sur le web, et je ne sais pas comment procéder. Voici le code que j'ai jusqu'ici. Si quelqu'un peut m'aider, je l'apprécierais vraiment.

public class Catégories étendues ListActivity { DataBaseHelper db = new DataBaseHelper (this); données SQLiteDatabase privées; position int;

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(); 
     } 
    }); 
} 

}

Répondre

4

J'ai une fonction similaire dans mon application. Vous devrez créer un fichier XML pour définir la disposition de la liste et l'appeler dans votre code Java.

Voici le code XML exemple:

LISTE:

<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> 

Ceci est le fichier XML de mise en page personnalisée. Je l'appelle 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> 

Et voici le code JAVA:

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); 

Le 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); 
} 

Ce que la nouvelle partie du code fait est simplement d'envoyer l'élément sélectionné à une autre activité grâce à une intention. Ensuite, dans la nouvelle activité, j'interroge la base de données en utilisant le nom de l'élément sélectionné dans le bundle et en affichant le résultat.

Demandez si vous avez besoin d'explications supplémentaires.

+0

Siddharth, C'est ce que j'ai déjà, si vous avez regardé mon code.J'ai de la difficulté à faire fonctionner ce code sans erreur tout en faisant ce que j'ai besoin de faire. Pouvez-vous poster la source entière au lieu d'un extrait? Utilisez-vous même OnItemClick? Merci ... – Devin

+0

Ajout du code supplémentaire. Vérifiez le message original. –

+0

Je suis vraiment désolé mais j'ai des problèmes ici. Je comprends ce qui est impliqué dans la préparation du curseur et la création d'un SimpleCursorAdapter. Cependant, je ne veux pas d'une nouvelle activité. Je le veux donc si quelqu'un clique sur un élément de la liste, il va interroger la base de données et retourner une liste de tous les mots de la catégorie sur laquelle on a cliqué. J'ai essayé le code que vous avez posté, et je finis par devoir forcer à quitter en ouvrant cette activité (je ne peux même pas accéder à la liste des catégories pour tester). Le code que j'ai posté ci-dessus fonctionne si vous supprimez la déclaration SimpleCursorAdapter et l'appel setListAdapter sur la ligne suivante. – Devin

0

Je fais un programme très similaire. J'ai des problèmes avec lui comme son premier programme pour Android/Java. Ce que j'ai de l'aide vient du web et de mon beau-père qui utilise java. Lorsque j'ai aidé à configurer une base de données, il m'a expliqué comment configurer mes tables afin que les catégories soient associées à des éléments. Ainsi vous aurez une table pour vos catégories comprenant le titre que vous montrerez pour cette catégorie aussi bien que votre clé primaire. Ensuite, vous avez besoin d'une table pour le niveau suivant de la catégorie, par exemple le titre. Cela inclurait un texte pour le titre et la clé primaire. Ensuite, vous devez créer une autre table pour les associer. Une clé de titre, une clé de catégorie et une clé primaire. À partir de là, vous devrez dire à java de les apparier en fonction de cette dernière table.

Je suis un noob désolé je ne pouvais pas donner plus/meilleure info. Mais tout ce que je trouve sur cette question, je vais poster ici et bonne chance.