3

曲再生アプリを作成しています。SharedPreferences に保持する Set があります。ファイル名を追加および削除し、追加したときと同じ順序に保ちたいと思います。たとえば、次のようにします。

recentsp = getSharedPreferences("recentkey", Context.MODE_PRIVATE);

    recent = recentsp.getStringSet("recent", recent);
    recentedited = recent;

    if (recentedited.contains(string) {
        recentedited.remove(string);
        Log.i(TAG, "Recent exists, removing song");
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recentedited);
        editor.commit();
    }

        recentedited.add(string);
    Log.i(TAG, "adding song to recent");
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recentedited);
        editor.commit();

しかし、これらを ListView で表示すると問題が発生します。最近再生したセクションを追加できるように、それらを追加した順序で並べたいのですが、まったく動かないこともあれば、最初に終わってしまうこともあります。ランダムに思えます。何か不足していますか?

編集:

初期化ステップでこれを行うことにより、SharedPreferences が null でないことを確認します...

編集:

LinkedHashSet を使用しても、適切な順序付けができません。SharedPreferences が null の場合にのみこれを呼び出すため、LinkedHashSet を使用していることを確認する方法が正確にはわかりません。

        recentsp = getSharedPreferences("recentkey", Context.MODE_PRIVATE);
    recent = recentsp.getStringSet("recent", null);
    if (recent == null) {

        recent = new LinkedHashSet<String>();
        SharedPreferences.Editor editor = recentsp.edit();
        editor.clear();
        editor.putStringSet("recent", recent);
        editor.commit();
    }
4

3 に答える 3

2

SharedPreferences に保持する Set があります。ファイル名を追加および削除し、それらを同じ順序に保ちたい

それは不可能です。Set実装を制御することはできず、Set注文する必要はありません。選択肢は次のとおりです。

  1. 順序を気にしないでください。

  2. で文字列セットを使用しないでSharedPreferencesください。代わりに、値を単一の文字列に格納します (たとえば、JSON にエンコードします)。

  3. を使用せずSharedPreferences、代わりに他のデータ ストレージ オプション (SQLite データベース、JSON ファイルなど) を使用します。

于 2016-02-03T00:00:52.767 に答える
0

Set の代わりに ArrayList を使用するだけかもしれません。項目が既にコレクションにある場合は、その項目が削除および追加されたことを確認するコードが既にあるようです。そのパターンは ArrayList で機能するはずです。

リストを設定にシリアル化するコードが必要な場合、この古い質問には例があります ArrayList を SharedPreferences に保存するか、GSON などを使用して保存および取得します

于 2016-02-02T23:59:40.880 に答える