Mam działanie, które rozszerza ExpandableListActivity. Używam SimpleCursorTreeAdapter do wypełnienia ExpandableListView. Mój układ zawiera widok listy i pusty widok. Przy uruchomieniu aplikacji ExpandableListActivity automatycznie wybiera odpowiedni widok do wyświetlenia.Jak zaktualizować widok listy rozwijanej, gdy dane adaptera ulegną zmianie
Moje kroki:
- uruchamia aplikację, nie ma żadnych danych. (pusty widok na ekranie)
- Wstaw niektóre dane do bazy danych.
- Call adapter.notifyDataSetChanged(); Ale pusty widok nadal znajduje się na ekranie i nie ma żadnego elementu w widoku listy.
Potem uruchom ponownie aplikację:
-
pojawia widok
- Lista . Rozwiń wszystkie grupy i przewiń do dołu.
- Klikam na pozycję na liście. Pojawia się nowa aktywność.
- Kliknij przycisk Wstecz. Wszystkie grupy są zwinięte, a my jesteśmy na górze ekranu. Pozycja przewijania i grupy rozwinięte nie są pamiętane.
- Usuń wszystkie dane z db i call adapter.notifyDataSetChanged();
- Widoki dla dzieci zniknęły, ale grupy najwyższego poziomu są nadal widoczne.
Pytania:
- Co mogę zrobić, aby zastąpić pusty widoku z widoku listy?
- Co mogę zrobić, aby zapisać stan grup i przewinąć pozycję widoku listy?
Testowane na SDK: 1.5r3, 1.6r1
Kod:
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;
}
}
}
pokazać nam realizację MyExpandableListAdapter, proszę. – Matthias
Realizacja jest właśnie tutaj. Przewiń w dół do dołu kodu. Poza tym zdałem sobie sprawę, że muszę ponowić kwerendę moje rubryki kursor ręcznie. Więc prawo kod będzie: rubricsCursor.requery(); mAdapter.notifyDataSetChanged(); Ale drugie pytanie jest nadal mnie martwi. –
Nie mogę wyjaśnić, jak bardzo ten blok kodu pomógł mi dzisiaj. Nie wiem, co bym zrobił bez tego. Stukrotne dzięki! – dfetter88