アプリの状態を記憶している変数をアプリ固有のPreferences領域に保存する。
いくつか種類があるが手間の少ないものを選択してみる。文字列配列の説明。お気に入りの画像ファイルのフルパスを配列保存しているのでPreferences領域に保存が必要。
文字列配列をプリファレンスへ保存するには Set<String> という型でないといけない。変換は簡単。
Set<String> sArray = new HashSet<String>( list );
これだけで変換は終了。ただし、大きな問題もある。Set<>型は同じ文字列の重複を許さない事。逆を言えば、重複を勝手に削除してくれる。自前で重複削除を作らなくていいのでラッキーだった。
List<String> list = new ArrayList<>();
list.add("ABC");
list.add("DEF");
list.add("ABC");
// 書き込み
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(Context);
Set<String> sArray = new HashSet<String>( list );
pref.edit().putStringSet("key_list", sArray ).apply();
sArray.clear();
実行して読み出すと
"ABC"
"DEF"
この二つしか保存されていない。
書き込むタイミングは、お気に入り登録時、onPause() 時、編集時あたりか。
読み込みは逆にList<>へ変換すれば良い。
// 読み出し
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(Context);
Set<String> sArray = pref.getStringSet("key_list", null );
if ( sArray != null ) list = new ArrayList<String>( sArray );
else list = new ArrayList<>();
sArray.clear();
List<String> list = new ArrayList<String>( sArray );
これで List<String> へ、キャスティングしてくれるそう。
重複文字列は削除済み。重複文字列も重要であれば、保存前に処理。
list.add( i, list.get( i ) + "/" + String.valueOf( i ) );
識別文字を付加して重複を回避する。全てに付加。読み出し後に識別部分を取り去る。