2009-09-23 8 views
7

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:

  1. se inicia la aplicación, no hay datos. (vista vacía en la pantalla)
  2. Inserte algunos datos en db.
  3. 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
  1. lista. Amplío todos los grupos y me desplazo hacia abajo.
  2. Hago clic en el elemento de la lista. Nueva actividad aparece.
  3. 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.
  4. Borrar todos los datos de db y llamar a adapter.notifyDataSetChanged();
  5. Las vistas secundarias han desaparecido, pero los grupos de nivel superior siguen siendo visibles.

Preguntas:

  1. ¿Qué puedo hacer yo para reemplazar vista vacía con vista de la lista?
  2. ¿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; 
     } 

    } 
} 
+0

muéstranos la implementación de MyExpandableListAdapter, por favor. – Matthias

+0

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. –

+0

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

Respuesta

4

Por lo tanto, la respuesta es:

  1. cursor.requery de llamadas() antes de llamar notifyDataSetChanged del adaptador() método.
  2. Guarda el estado de grupos en el método onPause() de la actividad y restaura en el método onResume().
2

Re: Pregunta # 2 ...

Por qué no puedes simplemente llamar View.invalidateViews() y View.requestLayout() en ese orden?

Si ya tiene su adaptador configurado para la vista, entonces no debería necesitar volver a consultar, ¿o sí? Al invalidar la vista y solicitar el diseño, no perderá ninguno de los estados de su vista.

Por ejemplo, en su método "onResume", invalide su vista de lista llamando a algo así como "lv.invalidateViews()". A continuación, llame a "lv.requestLayout()".

Su método "onCreate" debe seguir siendo responsable de configurar los adaptadores y vincular un adaptador a la vista. Para vincular el adaptador, considere usar "lv.setListAdapter()" en lugar del anterior para no estar jugando con las otras vistas en la pantalla.

Cuestiones relacionadas