アプリでリストを扱うときに少し便利になるかもしれないです。
GSON
AndroidでArrayListをローカルストレージに保存する際、SQLiteを使うほどでもない単純な場合は、JSONにしてからPreferenceに保存すると便利です。
今回はArrayList
JSONへの変換にGSON(Google製ライブラリ)を使うともっと簡単かもしれないです。
環境はAndroid Studio
まずはgsonライブラリをgradleで導入。
dependencies{ ... ... compile 'com.google.code.gson:gson:2.7' //追加 }
JSONから読み込み
private ArrayList<String> arrayList; SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE); Gson gson = new Gson(); arrayList = gson.fromJson(pref.getString(SAVE_KEY, ""), new TypeToken<ArrayList<String>>(){}.getType());
もしpreferenceに未保存の状態の処理も分岐させたいならこんな感じに
private ArrayList<String> arrayList; SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE); Gson gson = new Gson(); String json = pref.getString(SAVE_KEY, ""); if(json.equals("[]")){ //取得できなかった場合、枠だけ返ってくる arrayList = new ArrayList<>(); } else{ arrayList = gson.fromJson(json, new TypeToken<ArrayList<String>>(){}.getType()); }
書き込み
SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE); Gson gson = new Gson(); pref.edit().putString(SAVE_KEY, gson.toJson(arrayList)).apply();
ItemTouchHelper
RecyclerViewのItemTouchHelperを使うと比較的容易にリストのドラッグ&ドロップを実装できます。
ただそのままだとドラッグ&ドロップを行っても内部的にArrayListの順番は変更されない?
ので、そのリストをGSONで保存する時も不便です。
そこで少しコード追加。
といっても単純。
@Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target){ final int fromPosition = viewHolder.getAdapterPosition(); final int toPosition = target.getAdapterPosition(); recyclerAdapter.notifyItemMoved(fromPosition, toPosition); //追加ここから arrayList.add(toPosition, arrayList.remove(fromPosition)); //追加ここまで return true; }
消してから追加するのがポイント。
サンプル
GitHub
よくある上のGET IT ONですが、Googleにジェネレータがあったんですね。
Google Play Badges – Google