Tengo una actividad que amplía ExpandableListActivity. Yo uso SimpleCursorTreeAdapter para llenar ExpandableListView. Mi diseño contiene vista de lista y vista vacía. Al iniciar la aplicación, ExpandableListActivity elige automáticamente la vista correcta para mostrar.Cómo actualizar la vista de lista desplegable cuando cambian los datos del adaptador
Mis pasos:
- se inicia la aplicación, no hay datos. (vista vacía en la pantalla)
- Inserte algunos datos en db.
- Llame a adapter.notifyDataSetChanged(); Pero la vista vacía todavía está en la pantalla y no hay ningún elemento en mi vista de lista.
Luego reinicie aplicación:
-
aparece vista
- lista. Amplío todos los grupos y me desplazo hacia abajo.
- Hago clic en el elemento de la lista. Nueva actividad aparece.
- Haga clic en el botón Atrás. Todos los grupos están contraídos y estamos en la parte superior de la pantalla. La posición de desplazamiento y los grupos expandidos no se recuerdan.
- Borrar todos los datos de db y llamar a adapter.notifyDataSetChanged();
- Las vistas secundarias han desaparecido, pero los grupos de nivel superior siguen siendo visibles.
Preguntas:
- ¿Qué puedo hacer yo para reemplazar vista vacía con vista de la lista?
- ¿Qué puedo hacer para guardar el estado de grupos y la posición de desplazamiento de la vista de lista?
Probado en los SDK: 1.5r3, 1.6r1
Código:
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;
}
}
}
muéstranos la implementación de MyExpandableListAdapter, por favor. – Matthias
La implementación está aquí. Desplázate hacia abajo hasta la parte inferior del código. Además, me he dado cuenta de que necesito volver a consultar mi cursor de rúbricas manualmente. Entonces el código correcto será: rubricsCursor.requery(); mAdapter.notifyDataSetChanged(); Pero la segunda pregunta todavía me preocupa. –
No puedo explicar lo mucho que este bloque de código me ayudó hoy. No sé lo que hubiera hecho sin eso. ¡Un millón de gracias! – dfetter88