surga Lab

営業部でも開発したい!!

GSONとItemTouchHelperでいい感じにリスト形式を保存する

アプリでリストを扱うときに少し便利になるかもしれないです。

GSON

AndroidでArrayListを保存する際、SQLiteを使うほどでもない単純な場合は、JSONにしてPreferenceに保存すると便利です。

今回はArrayList型を変換します。

JSONへの変換にGSON(Google製ライブラリ)を使うともっと簡単かもしれないです。

github.com

環境は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

github.com

Playストアでも公開しています。
Get it on Google Play

よくある上のGET IT ONですが、Googleにジェネレータがあったんですね。
Google Play Badges – Google