1

私はAndroidが初めてです。私の場合、 MultiSelectListPreference を使用したいと思います。

しかし、問題が発生しました。リストで要素の順序を維持する必要があります。5 つの要素があるとします。

0 - Tom
1 - David
2 - Bob
3 - Mary
4 - Chris

ユーザーは 0、2、3 を選択します。次に、リストは次の順序である必要があります。

トム、ボブ、メアリー

しかし、MultiSelectListPreference はSet<String>ではなくArrayList<String>に設定を保存するため、 のため、この順序については不明ですSet

この注文を確認するにはどうすればよいですか? ありがとうございました。

4

1 に答える 1

1

camdaochemgio、編集前からあなたの質問を理解しました。

Set (一意の値を格納する) について話しているので、この getValues() 関数は、データのプリセットに基づいて、値をインデックスに変換する独自の revertValues 関数に入力する必要があります。私はあなたのコードを求めたので、あなた自身のスタイル/用語でこれに対する解決策を書くことで自分自身を表現することができました.

ソリューション:

MultiSelectListPreferenceのドキュメントで次のメソッドに気付きました:

int findIndexOfValue(String value)

しかし、オブジェクトへのそのような参照を保存しないので、このクラスを作成して MultiSelectListPreference を拡張しました(新しいファイルで!):

public class DataHolder extends MultiSelectListPreference {

    // note: AttributeSet  is needed in super class
    public DataHolder(Context context,AttributeSet attrs) {   
        super(context, attrs);

        List<CharSequence> entries = new ArrayList<CharSequence>();
        List<CharSequence> entriesValues = new ArrayList<CharSequence>();

        /** We could use the String Array like you did in your Q, 
         * But I preffer this way of populating data - 
         * It keeps things open and unlimitted.
         * If you really want the data picked up from the xml , just use : 
         * context.getResources().getStringArray(R.array.entries)  and
         * context.getResources().getStringArray(R.array.entryValues) 
         * */

        entries.add("0");
        entries.add("1");
        entries.add("2");
        entries.add("3");
        entries.add("4");
        entriesValues.add("Tom");
        entriesValues.add("David");
        entriesValues.add("Bob");
        entriesValues.add("Mary");
        entriesValues.add("Chris");

        setEntries(entries.toArray(new CharSequence[5]));
        setEntryValues(entriesValues.toArray(new CharSequence[5]));
    }
}

次に、リスナーにプラグインする必要があります。SettingsFragment クラスで、新しいフィールドを追加するだけです:

private DataHolder dh = null;

コンストラクターを変更して、それを受け入れて初期化します。

public SettingsFragment(Context c) {
    dh = new DataHolder(c,null);
}

次のステップ: xml からデータへの参照を削除します。次のようになります。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <com.example.multiselectpref.DataHolder
        android:key="pref_key_name_choice"
        android:title="@string/name_choice"
    />
</PreferenceScreen>

リスナーに戻ると、 onSharedPreferenceChanged メソッドで、トーストを次のように変更できます。

toast_message += (dh.findIndexOfValue(name) + ": "+name+"    , ");

私のために働く..(フォーク@ https://github.com/li3ro/MultiSelectPrefにコミットされたコード)

于 2014-10-11T16:03:58.543 に答える