15

構成の変更が発生すると、ListView チェックボックスの状態が失われます。その理由は理解できます。私は実装しようとします

public void onSaveInstanceState(final Bundle outState)

私のフラグメントの1つに。だから、 SparseBooleanArray をoutStateに格納する最も簡単な方法は何だろうと思っています。

また、ListViewには次のメソッドがあるため、少し混乱しています。

getListView().getCheckedItemPositions();

これは何の役に立つのですか?

4

8 に答える 8

4

質問の最後の部分に対する回答がありません。

また、ListViewには次のメソッドがあるため、少し混乱しています。

getListView().getCheckedItemPositions();

これは何の役に立つのですか?

アクション モードと組み合わせてチェックボックスを使用していると仮定すると、アクション モード自体がチェックされた位置の状態を保存します。通常モードでは、長押しするとアイテムが強調表示され、アクション モードが有効になり、ユーザーは他のアイテムをタップしてそれらをチェックできるようになります。

向きが変わるとどうなりますか?アクション モードが再開され、ハイライトが保持されます。あなたのチェックボックスはそうではありませんが、明らかにチェックされているもののデータです。

向きの変更後、onCreateActionMode()が呼び出されます。このメソッドでは (前ではなく)、おそらく探しているgetListView().getCheckedItemPositions()が返されます。SparseBooleanArray

これについての気の利いた部分は、これが の唯一の使用例である場合、SparseBooleanArray自分で保管することさえ心配する必要がないことです。すでに格納されているシステムから、向きの変更を介して取得できます。

それgetListView().getCheckedItemPositions()が良いことです。

于 2013-04-28T17:29:16.750 に答える
2

そのデータ構造のシリアル化スキームを発明するか、HashSet に切り替えて、チェックされたリストのインデックス位置のみを格納することができます。HashSet はシリアライズ可能であるため、インスタンス状態 Bundle に入れるだけです。

于 2012-06-29T23:35:54.960 に答える
1

私は同じことをしようとしています。当初、私は使用していましたHashMap

インテントを使用してハッシュマップ値を別のアクティビティに送信する方法

インターフェイスを拡張するため、アクティビティ間を通過しSerializableます。ただし、いくつかの調査を行った後:

「にマップするためにSparseBooleanArraysを使用するよりも効率的であることを目的としています。」HashMapIntegersBooleans

ただし、このデータ構造を格納する簡単な方法を見つけることができません。の値を取得して、アクティビティ間で受け渡すことができるようにSparseBooleanArrayに保存することを検討しました。HashMapしかし、これにより複雑さが増すようです。

残念ながら、チェックボックスのリストを保存するためにHashMapsを使用することに戻ると思います

于 2012-08-16T05:49:27.413 に答える
0

これが私の解決策です。をシリアル化するために使用できる単純なラッパーですSparseBooleanArray

public class SerializableSparseBooleanArrayContainer implements Serializable {

    private static final long serialVersionUID = 393662066105575556L;
    private SparseBooleanArray mSparseArray;

    public SerializableSparseBooleanArrayContainer(SparseBooleanArray mDataArray) {
        this.mSparseArray = mDataArray;
    }

    public SparseBooleanArray getSparseArray() {
        return mSparseArray;
    }

    public void setSparseArray(SparseBooleanArray sparseArray) {
        this.mSparseArray = sparseArray;
    }

    private void writeObject(java.io.ObjectOutputStream out) throws IOException {
        out.writeLong(serialVersionUID);
        int sparseArraySize = mSparseArray.size();
        out.write(sparseArraySize);
        for (int i = 0 ; i < sparseArraySize; i++){
            int key = mSparseArray.keyAt(i);
            out.writeInt(key);
            boolean value = mSparseArray.get(key);
            out.writeBoolean(value);
        }
    }

    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
        long readSerialVersion = in.readLong();
        if (readSerialVersion != serialVersionUID) {
            throw new IOException("serial version mismatch");
        }
        int sparseArraySize = in.read();
        mSparseArray = new SparseBooleanArray(sparseArraySize);
        for (int i = 0 ; i < sparseArraySize; i++) {
            int key = in.readInt();
            boolean value = in.readBoolean();
            mSparseArray.put(key, value);
        }
    }

}

次に、次のようにオブジェクトをバンドルに追加します。

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    SparseBooleanArray sparseBooleanArray = getSparseBooleanArray();
    SerializableSparseBooleanArrayContainer sparseBooleanArraySerializable = new SerializableSparseBooleanArrayContainer(sparseBooleanArray);
    outState.putSerializable(SOME_BUNDLE_KEY, sparseBooleanArraySerializable);
}
于 2013-01-25T08:39:40.810 に答える