Ho provato la soluzione creando SerializableSparseArray
estendentesi SparseArray
rendendo possibile mettere un SparseArray
in fascio tramite Bundle.putSerializable
chiamata.
Ma ho trovato che non è possibile ottenere l'oggetto salvato dal pacchetto in onRestoreInstanceState
. Scavando nel problema ho trovato che savedInstanceState.getSerializable(KEY_TO_STRING_SPARSE_ARRAY) == null
.
Quindi, cercando di ispezionare savedInstanceState.get(KEY_TO_STRING_SPARSE_ARRAY)
e sorprendentemente ottenuto un SparseArray<String>
non SerializableSparseArray<String>
. Finalmente sto usando savedInstanceState.getSparseParcelableArray(KEY_TO_STRING_SPARSE_ARRAY)
per ottenere SparseArray
da un pacchetto.
Quindi, utilizzando java reflection per salvare un SparseArray<String>
da raggruppare direttamente senza estendere con l'interfaccia Serializable
o Parcelable
. È un po 'sporco, ma penso che si possa fare la propria funzione di utilità nascondendo la seguente implementazione di dettaglio.
try {
// FIXME WTF
Method m = Bundle.class.getMethod("putSparseParcelableArray", String.class, SparseArray.class);
m.invoke(savedInstanceState, KEY_TO_STRING_SPARSE_ARRAY, mSparseStringArray);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
Log.e(TAG, "exception", e);
}
Ho testato il codice e funziona su Android 4.4.4. E mi piacerebbe sapere se è sicuro utilizzare l'implementazione in altre implementazioni SDK.
Potrebbe non essere necessario utilizzare 'onSaveInstanceState()'. Vedi http://stackoverflow.com/questions/24294919/maintain-item-selection-on-orientation-change – faizal