2010-02-14 10 views
9

Sto scrivendo una semplice applicazione per Android.Android ExpandableListActivity e SimpleCursorTreeAdapter?

Ho due tabelle, una chiamata "grous" e un'altra chiamata "group_items".

Desidero utilizzare l'elenco espandibile per visualizzare i dati da entrambe le tabelle.

Qual è il modo migliore per farlo? È possibile mappare i dati usando SimpleCursorTreeAdapter? Non sono riuscito a trovare nessun esempio utile.

Ho visto gli esempi creare elenchi espandibili utilizzando ArrayAdapter, quindi devo prima convertire i dati in array e quindi creare un elenco espandibile con esso oppure esiste un modo per farlo direttamente?

Non ho bisogno di un esempio operativo completo: solo un consiglio su quale sia il modo corretto e più efficiente per farlo.

Leonti

+0

Hai avuto uno sguardo qui: http://developer.android.com/resources/samples/ApiDemos/ src/com/example/android/apis/view/List6.html? –

+0

@Leonti: quindi potresti trovare una soluzione? se sì, per favore condividi. sarà molto utile in quanto non è disponibile un buon esempio. Grazie –

+0

Sto facendo qualcosa di simile QUI http://stackoverflow.com/questions/10611927/simplecursortreeadapter-and-cursorloader – toobsco42

risposta

19

ho scoperto che la soluzione più semplice sarebbe quella di utilizzare SimpleCursorTreeAdapter. Ecco codice di esempio (parti importanti):

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

} 

} 

Spero che sarà utile;)

+0

Molto utile, per quelli di noi che cercano di evitare Content Provider. –

+0

Signore, puoi rispondere alla mia domanda anche http://stackoverflow.com/questions/29457424/expandablelistview-extends-simplecursoradapter-to-populate-from-sqlite – silverFoxA