2009-09-23 8 views
7

J'ai une activité qui étend ExpandableListActivity. J'utilise SimpleCursorTreeAdapter pour remplir ExpandableListView. Ma mise en page contient une vue en liste et une vue vide. Au démarrage de l'application, ExpandableListActivity choisit automatiquement la bonne vue à afficher.Comment mettre à jour l'affichage de liste extensible lorsque les données de l'adaptateur changent

Mes pas:

  1. App démarre, il n'y a pas de données. (affichage vide à l'écran)
  2. Insérer des données dans db.
  3. Appelez adapter.notifyDataSetChanged(); Mais la vue vide est toujours à l'écran et il n'y a aucun élément dans ma liste.

Je redémarrer l'application:

  1. vue de liste apparaît. Je développe tous les groupes et défile vers le bas.
  2. Je clique sur l'élément dans la liste. Nouvelle activité apparaît.
  3. Cliquez sur le bouton de retour. Tous les groupes sont effondrés et nous sommes en haut de l'écran. La position de défilement et les groupes étendus ne sont pas mémorisés.
  4. Supprimez toutes les données de la base de données et appelez adapter.notifyDataSetChanged();
  5. Les vues enfant ont disparu, mais les groupes de niveau supérieur sont toujours visibles.

Questions:

  1. Que puis-je faire pour remplacer vue vide avec vue sur la liste?
  2. Que puis-je faire pour enregistrer l'état des groupes et la position de défilement de la liste?

Testé sur: SDKs 1.5r3, 1.6r1

code:

public class MainActivity extends ExpandableListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     dbHelper = new DBOpenHelper(this); 

     rubricsDbAdapter = new RubricsDBAdapter(dbHelper); 
     rubricsDbAdapter.open(); 

     itemsDbAdapter = new ItemsDBAdapter(dbHelper); 
     itemsDbAdapter.open(); 

     rubricsCursor = rubricsDbAdapter.getAllItemsCursor(); 
     startManagingCursor(rubricsCursor); 

     // Cache the ID column index 
     rubricIdColumnIndex = rubricsCursor.getColumnIndexOrThrow(RubricsDBAdapter.KEY_ID); 

     // Set up our adapter 
     mAdapter = new MyExpandableListAdapter(rubricsCursor, 
       this, 
       android.R.layout.simple_expandable_list_item_1, 
       android.R.layout.simple_expandable_list_item_1, 
       new String[] {RubricsDBAdapter.KEY_NAME}, 
       new int[] {android.R.id.text1}, 
       new String[] {ItemsDBAdapter.KEY_NAME}, 
       new int[] {android.R.id.text1}); 

     setListAdapter(mAdapter); 
    } 

    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
     Intent i = new Intent(this, ItemViewActivity.class); 
     i.putExtra(ItemsDBAdapter.KEY_ID, id); 
     startActivity(i); 

     return super.onChildClick(parent, v, groupPosition, childPosition, id); 
    } 

    private void updateMyData() { 
     int i; 
     int k; 
     long rubricId; 

     for (i = 1; i <= 5; i++) { 
      rubricId = rubricsDbAdapter.insert("rubric " + i); 
      for (k = 1; k <= 5; k++) { 
       itemsDbAdapter.insert("item " + i + "-" + k, rubricId); 
      } 
     } 

     mAdapter.notifyDataSetChanged(); 
    } 

    private void deleteMyData() { 
     rubricsDbAdapter.deleteAll(); 
     itemsDbAdapter.deleteAll(); 

     mAdapter.notifyDataSetChanged(); 
    } 

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

     @Override 
     protected Cursor getChildrenCursor(Cursor notebookCursor) { 
      // Given the group, we return a cursor for all the children within that group 
      long id = notebookCursor.getLong(rubricIdColumnIndex); 

      Cursor itemsCursor = itemsDbAdapter.getRubricItemsCursor(id); 
      startManagingCursor(itemsCursor); 
      return itemsCursor; 
     } 

    } 
} 
+0

montrez-nous la mise en œuvre de MyExpandableListAdapter, s'il vous plaît. – Matthias

+0

La mise en œuvre est ici. Faites défiler vers le bas du code. En outre, j'ai réalisé, que j'ai besoin de requery mon curseur de rubriques manuellement. Donc le bon code sera: rubricsCursor.requery(); mAdapter.notifyDataSetChanged(); Mais la deuxième question me préoccupe toujours. –

+0

Je ne peux pas vous expliquer à quel point ce bloc de code m'a aidé aujourd'hui. Je ne sais pas ce que j'aurais fait sans. Merci un million! – dfetter88

Répondre

4

Alors, la réponse est:

  1. Appel cursor.requery() avant d'appeler notifyDataSetChanged de l'adaptateur() méthode.
  2. Enregistrer l'état des groupes dans la méthode onPause() de l'activité et restaurer dans la méthode onResume().
2

Re: Question # 2 ...

Pourquoi ne pouvez-vous appeler simplement View.invalidateViews() et View.requestLayout() dans cet ordre?

Si vous avez déjà configuré votre adaptateur sur la vue, vous ne devriez pas avoir besoin de rafraîchir, n'est-ce pas? En invalidant la vue et en demandant la mise en page, vous ne perdrez aucun des états de votre vue. Par exemple, dans votre méthode "onResume", invalidez votre vue de liste en appelant quelque chose comme "lv.invalidateViews()". Ensuite, appelez "lv.requestLayout()".

Votre méthode "onCreate" devrait toujours être responsable de la configuration des adaptateurs et de la liaison d'un adaptateur à la vue. Pour lier l'adaptateur, pensez à utiliser "lv.setListAdapter()" à la place de l'ancien afin de ne pas jouer avec les autres vues à l'écran.

Questions connexes