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:
- App démarre, il n'y a pas de données. (affichage vide à l'écran)
- Insérer des données dans db.
- 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:
- vue de liste apparaît. Je développe tous les groupes et défile vers le bas.
- Je clique sur l'élément dans la liste. Nouvelle activité apparaît.
- 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.
- Supprimez toutes les données de la base de données et appelez adapter.notifyDataSetChanged();
- Les vues enfant ont disparu, mais les groupes de niveau supérieur sont toujours visibles.
Questions:
- Que puis-je faire pour remplacer vue vide avec vue sur la liste?
- 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;
}
}
}
montrez-nous la mise en œuvre de MyExpandableListAdapter, s'il vous plaît. – Matthias
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. –
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