Come preservare la posizione di scorrimento in un ExpandableListView

nella mia app ho una class derivata da ExpandableListActivity. Quando scorri il contenuto e modifichi l'orientamento del telefono o si modifica un elemento e ritornerò all'elenco, la posizione dell'elenco originale non viene preservata. Ho provato due soluzioni simili a quelle recentemente usate con le classi derivate da ListActivity.

Soluzione 1:

  • Come posso assicurare la compatibilità tra i livelli di API Android per RotationVector?
  • Sposta il button di azione galleggiante sopra la tastiera
  • come posso rilevare se il telefono android in modalità silenziosa in modo programmato
  • Scorrimento indice Android
  • Come clonare un repository di git remoto con Android Studio?
  • Cerca modificare il text come Google Play
  • protected void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); mListState = state.getParcelable(LIST_STATE); } protected void onResume() { super.onResume(); loadData(); if (mListState != null) getExpandableListView().onRestoreInstanceState(mListState); } protected void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); mListState = getExpandableListView().onSaveInstanceState(); state.putParcelable(LIST_STATE, mListState); } 

    Soluzione 2:

     protected void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); mListPosition = state.getInt(LIST_STATE); } protected void onResume() { super.onResume(); loadData(); getExpandableListView().setSelection(mListPosition); } protected void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); mListPosition = getExpandableListView().getFirstVisiblePosition(); state.putInt(LIST_STATE, mListPosition); } 

    Nessuna soluzione funziona. Ho anche cercato di combinare le due soluzioni, e questo funziona quando si modifica un elemento e torna all'elenco, ma NON funziona quando cambio l'orientamento del telefono

    Chiunque può suggerire un buon modo per raggiungere il mio objective?

    4 Solutions collect form web for “Come preservare la posizione di scorrimento in un ExpandableListView”

    Dopo alcuni esperimenti sono arrivato a una soluzione soddisfacente, che conserva anche la posizione di scorrimento fine dell'elemento superiore visibile.

    Infatti, tre diversi elementi di informazioni devono essere salvati e ripristinati: lo stato dell'elenco (ad esempio quali gruppi sono espansi), l'indice del primo elemento visibile e la sua posizione di scorrimento fine.

    Purtroppo, sembra che solo il primo viene salvato dal metodo onSaveInstanceState della vista di elenco espandibile, per cui gli altri due devono essere salvati separatamente. Questo è diverso da una vista di elenco non espandibile, where viene visualizzato il metodo onSaveInstanceState che salva tutte le informazioni necessarie per ripristinare correttamente lo stato e la posizione dell'elenco (su questo argomento, vedere Risparmio / Salva / Ripristina posizione di scorrimento quando si torna a ListView ).

    Ecco gli snippet di codice; in cima alla class derivata da ExpandableListActivity:

     private static final String LIST_STATE_KEY = "listState"; private static final String LIST_POSITION_KEY = "listPosition"; private static final String ITEM_POSITION_KEY = "itemPosition"; private Parcelable mListState = null; private int mListPosition = 0; private int mItemPosition = 0; 

    Poi, alcuni aggiustano:

     protected void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); // Retrieve list state and list/item positions mListState = state.getParcelable(LIST_STATE_KEY); mListPosition = state.getInt(LIST_POSITION_KEY); mItemPosition = state.getInt(ITEM_POSITION_KEY); } protected void onResume() { super.onResume(); // Load data from DB and put it onto the list loadData(); // Restore list state and list/item positions ExpandableListView listView = getExpandableListView(); if (mListState != null) listView.onRestoreInstanceState(mListState); listView.setSelectionFromTop(mListPosition, mItemPosition); } protected void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); // Save list state ExpandableListView listView = getExpandableListView(); mListState = listView.onSaveInstanceState(); state.putParcelable(LIST_STATE_KEY, mListState); // Save position of first visible item mListPosition = listView.getFirstVisiblePosition(); state.putInt(LIST_POSITION_KEY, mListPosition); // Save scroll position of item View itemView = listView.getChildAt(0); mItemPosition = itemView == null ? 0 : itemView.getTop(); state.putInt(ITEM_POSITION_KEY, mItemPosition); } 

    Questo funziona bene sul mio dispositivo Froyo.

    Così ho ottenuto ExpandableListView.onRestoreInstanceState e onSaveInstanceState per lavorare …

    Se si utilizza BaseExpandableListAdapter l'implementazione predefinita di getCombinedChildId restituisce un numero negativo. Se esamini il codice per ripristinare un elenco dalla posizione di scorrimento dello stato salvato, ignora gli id ​​che sono negativi. Restituire un ID positivo in modo che AbsListView onRestoreInstanceState impostare correttamente la posizione di scorrimento. Per restituire gli ID positivi modificare o getCombinedChildId da 0x8000000000000000L (negativo) a 0x7000000000000000L (positivo) superando il metodo nella tua sottoclass di BaseExpandableListAdapter come segue …

      public long getCombinedChildId(long groupId, long childId) { long or = 0x7000000000000000L; long group = (groupId & 0x7FFFFFFF) << 32; long child = childId & 0xFFFFFFFF; return or | group | child; } 

    Ho trovato un altro modo per farlo funzionare per me per mantenere lo stato. Ecco il link.

    http://markmail.org/message/msesxums77bdoqnx#query:+page:1+mid:utmart4ob7flh3u7+state:results

    Il riepilogo è che devi sempre impostare lo stato, anche se convertView! = Null.

    Non conosco le ripercussioni di sempre lo stato, ma nel mio caso funziona perfettamente.

    Per impedire il ricaricamento dell'attività durante la modifica dell'orientamento del telefono, aggiungi semplicemente la seguente row al tuo AndroidManifest.xml nella sezione attività:

      android:configChanges="keyboardHidden|orientation|screenSize" 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.