在Bundle中存储SparseBooleanArray的最佳方法?

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€


tig*_*chi 2

您可以为该数据结构发明一些序列化方案,也可以切换到 HashSet 并仅存储已检查的列表索引位置。由于 HashSet 是可序列化的,因此您可以将其放入实例状态 Bundle 中。