2010-02-14 3 views
9

J'écris une application simple pour Android.Android ExpandableListActivity et SimpleCursorTreeAdapter?

J'ai 2 tables - une appelée «grous» et une autre appelée «group_items».

Je souhaite utiliser la liste extensible pour afficher les données des deux tables.

Quelle est la meilleure façon de le faire? Est-il possible de mapper des données en utilisant SimpleCursorTreeAdapter? Je n'ai pas trouvé d'exemples utiles.

J'ai vu les exemples de création de listes extensibles à l'aide de ArrayAdapter. Devrais-je d'abord convertir les données en tableau, puis créer une liste extensible ou y-a-t-il un moyen de le faire?

Je n'ai pas besoin d'un exemple de travail complet - juste un conseil sur la manière correcte et la plus efficace de le faire.

Leonti

+0

Avez-vous eu un coup d'oeil ici: http://developer.android.com/resources/samples/ApiDemos/ src/com/exemple/android/apis/voir/List6.html? –

+0

@Leonti: alors pourriez-vous trouver une solution? Si oui, merci de le partager. ce sera très utile car il n'y a pas de bon exemple disponible. Merci –

+0

Je fais quelque chose de similaire ICI http://stackoverflow.com/questions/10611927/simplecursortreeadapter-and-cursorloader – toobsco42

Répondre

19

J'ai trouvé que la solution la plus simple serait d'utiliser SimpleCursorTreeAdapter. est exemple de code ici (pièces importantes):

public class ExercisesList extends ExpandableListActivity { 


private ExcercisesDbAdapter mDbHelper; // your db adapter 
private Cursor mGroupsCursor; // cursor for list of groups (list top nodes) 
private int mGroupIdColumnIndex; 
private MyExpandableListAdapter mAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mDbHelper = new ExcercisesDbAdapter(this); 
     mDbHelper.open(); 
     fillData(); 
} 

private void fillData() { 
     mGroupsCursor = mDbHelper.fetchAllGroups(); // fills cursor with list of your top nodes - groups 
     startManagingCursor(mGroupsCursor); 

     // Cache the ID column index 
     mGroupIdColumnIndex = mGroupsCursor 
         .getColumnIndexOrThrow(ExcercisesDbAdapter.KEY_ROWID); 

     // Set up our adapter 
     mAdapter = new MyExpandableListAdapter(mGroupsCursor,this, 

         android.R.layout.simple_expandable_list_item_1, 
         R.layout.exercise_list_row, 

         new String[] { ExcercisesDbAdapter.KEY_TITLE }, // group title for group layouts 
         new int[] { android.R.id.text1 }, 

         new String[] { ExcercisesDbAdapter.KEY_TITLE }, // exercise title for child layouts 
         new int[] { R.id.exercise_title }); 

     setListAdapter(mAdapter); 
} 

// extending SimpleCursorTreeAdapter 
public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { 

     public MyExpandableListAdapter(Cursor cursor, Context context, 
         int groupLayout, int childLayout, String[] groupFrom, 
         int[] groupTo, String[] childrenFrom, int[] childrenTo) { 
       super(context, cursor, groupLayout, groupFrom, groupTo, 
           childLayout, childrenFrom, childrenTo); 
     } 

     // returns cursor with subitems for given group cursor 
     @Override 
     protected Cursor getChildrenCursor(Cursor groupCursor) { 
       Cursor exercisesCursor = mDbHelper 
           .fetchExcercisesForGroup(groupCursor 
               .getLong(mGroupIdColumnIndex)); 
       startManagingCursor(exercisesCursor); 
       return exercisesCursor; 
     } 

     // I needed to process click on click of the button on child item 
     public View getChildView(final int groupPosition, 
         final int childPosition, boolean isLastChild, View convertView, 
         ViewGroup parent) { 
       View rowView = super.getChildView(groupPosition, childPosition, 
           isLastChild, convertView, parent); 

       Button details = (Button) rowView.findViewById(R.id.view_button); 

       details.setOnClickListener(new OnClickListener() { 
         public void onClick(View v) { 

           Cursor exerciseCursor = getChild(groupPosition, childPosition); 

           Long exerciseId = exerciseCursor.getLong(exerciseCursor.getColumnIndex(ExcercisesDbAdapter.KEY_ROWID)); 

           Intent i = new Intent(ExercisesList.this, ExerciseView.class); 
           i.putExtra(ExcercisesDbAdapter.KEY_ROWID, exerciseId); 
           startActivity(i); 
         } 
       }); 

       return rowView; 
     } 

} 

} 

espère qu'il sera utile;)

+0

Très utile, pour ceux d'entre nous qui essayent d'éviter les fournisseurs de contenu. –

+0

Monsieur, pouvez-vous s'il vous plaît répondre à ma question aussi http://stackoverflow.com/questions/29457424/expandablelistview-extends-simplecursoradapter-to-populate-from-sqlite – silverFoxA