Kit*_*fer 14 methods android sparse-array onconfigurationchanged
当配置更改发生时,我的ListView复选框状态会丢失,我理解为什么.我试着实施
public void onSaveInstanceState(final Bundle outState)
Run Code Online (Sandbox Code Playgroud)
在我的一个碎片中.所以我只是想知道在outState中存储SparseBooleanArray的最简单方法是什么.
另外,我有点困惑,因为ListView有方法:
getListView().getCheckedItemPositions();
Run Code Online (Sandbox Code Playgroud)
这有什么用?
ops*_*dao 38
在我的例子中,我最终通过在SparseBooleanArray周围实现一个Parcelable包装来实现它,如下所示:
import android.os.Parcel;
import android.os.Parcelable;
import android.util.SparseBooleanArray;
public class SparseBooleanArrayParcelable extends SparseBooleanArray implements Parcelable {
public static Parcelable.Creator<SparseBooleanArrayParcelable> CREATOR = new Parcelable.Creator<SparseBooleanArrayParcelable>() {
@Override
public SparseBooleanArrayParcelable createFromParcel(Parcel source) {
SparseBooleanArrayParcelable read = new SparseBooleanArrayParcelable();
int size = source.readInt();
int[] keys = new int[size];
boolean[] values = new boolean[size];
source.readIntArray(keys);
source.readBooleanArray(values);
for (int i = 0; i < size; i++) {
read.put(keys[i], values[i]);
}
return read;
}
@Override
public SparseBooleanArrayParcelable[] newArray(int size) {
return new SparseBooleanArrayParcelable[size];
}
};
public SparseBooleanArrayParcelable() {
}
public SparseBooleanArrayParcelable(SparseBooleanArray sparseBooleanArray) {
for (int i = 0; i < sparseBooleanArray.size(); i++) {
this.put(sparseBooleanArray.keyAt(i), sparseBooleanArray.valueAt(i));
}
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
int[] keys = new int[size()];
boolean[] values = new boolean[size()];
for (int i = 0; i < size(); i++) {
keys[i] = keyAt(i);
values[i] = valueAt(i);
}
dest.writeInt(size());
dest.writeIntArray(keys);
dest.writeBooleanArray(values);
}
}
Run Code Online (Sandbox Code Playgroud)
这允许您通过以下操作来保存和加载SparseBooleanArray:
Bundle bundle; //For your activity/fragment state, to include in an intent, ...
SparseBooleanArray sbarray; //Probably from your listview.getCheckedItemPositions()
//Write it
bundle.putParcelable("myBooleanArray", new SparseBooleanArrayParcelable(sbarray));
//Read it back
sbarray = (SparseBooleanArray) bundle.getParcelable("myBooleanArray");
Run Code Online (Sandbox Code Playgroud)
只是我的.02€
您可以为该数据结构发明一些序列化方案,也可以切换到 HashSet 并仅存储已检查的列表索引位置。由于 HashSet 是可序列化的,因此您可以将其放入实例状态 Bundle 中。
归档时间: |
|
查看次数: |
8847 次 |
最近记录: |