Jawaban di sini sudah bagus, tetapi tidak selalu berfungsi untuk Grup View kustom. Untuk mendapatkan semua Tampilan kustom untuk mempertahankan statusnya, Anda harus mengganti onSaveInstanceState()
dan onRestoreInstanceState(Parcelable state)
di setiap kelas. Anda juga perlu memastikan mereka semua memiliki id unik, apakah mereka digelembungkan dari xml atau ditambahkan secara programatis.
Apa yang saya hasilkan sangat mirip dengan jawaban Kobor42, tetapi kesalahannya tetap karena saya menambahkan Tampilan ke ViewGroup kustom secara terprogram dan tidak menetapkan id unik.
Tautan yang dibagikan oleh mato akan berfungsi, tetapi itu berarti tidak ada satu pun Tampilan individu yang mengelola keadaan mereka sendiri - seluruh negara disimpan dalam metode ViewGroup.
Masalahnya adalah bahwa ketika beberapa ViewGroup ini ditambahkan ke tata letak, id elemen mereka dari xml tidak lagi unik (jika didefinisikan dalam xml). Saat runtime, Anda dapat memanggil metode statis View.generateViewId()
untuk mendapatkan id unik untuk Tampilan. Ini hanya tersedia dari API 17.
Ini kode saya dari ViewGroup (abstrak, dan mOriginalValue adalah variabel tipe):
public abstract class DetailRow<E> extends LinearLayout {
private static final String SUPER_INSTANCE_STATE = "saved_instance_state_parcelable";
private static final String STATE_VIEW_IDS = "state_view_ids";
private static final String STATE_ORIGINAL_VALUE = "state_original_value";
private E mOriginalValue;
private int[] mViewIds;
// ...
@Override
protected Parcelable onSaveInstanceState() {
// Create a bundle to put super parcelable in
Bundle bundle = new Bundle();
bundle.putParcelable(SUPER_INSTANCE_STATE, super.onSaveInstanceState());
// Use abstract method to put mOriginalValue in the bundle;
putValueInTheBundle(mOriginalValue, bundle, STATE_ORIGINAL_VALUE);
// Store mViewIds in the bundle - initialize if necessary.
if (mViewIds == null) {
// We need as many ids as child views
mViewIds = new int[getChildCount()];
for (int i = 0; i < mViewIds.length; i++) {
// generate a unique id for each view
mViewIds[i] = View.generateViewId();
// assign the id to the view at the same index
getChildAt(i).setId(mViewIds[i]);
}
}
bundle.putIntArray(STATE_VIEW_IDS, mViewIds);
// return the bundle
return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
// We know state is a Bundle:
Bundle bundle = (Bundle) state;
// Get mViewIds out of the bundle
mViewIds = bundle.getIntArray(STATE_VIEW_IDS);
// For each id, assign to the view of same index
if (mViewIds != null) {
for (int i = 0; i < mViewIds.length; i++) {
getChildAt(i).setId(mViewIds[i]);
}
}
// Get mOriginalValue out of the bundle
mOriginalValue = getValueBackOutOfTheBundle(bundle, STATE_ORIGINAL_VALUE);
// get super parcelable back out of the bundle and pass it to
// super.onRestoreInstanceState(Parcelable)
state = bundle.getParcelable(SUPER_INSTANCE_STATE);
super.onRestoreInstanceState(state);
}
}