質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

Q&A

解決済

1回答

1847閲覧

RecyclerViewのリストをドラッグ移動しても状態が保存されない。

Peanuts888

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ドラッグ&ドロップ

コンピューターのGUIにおいて、バーチャルなものを「つかむ」ことによって選択し、別の場所や他のバーチャルなものの上に動かす行為、またはその行為に対応していることを指す。

0グッド

0クリップ

投稿2020/04/22 09:33

編集2020/04/28 02:11

RecyclerViewにリストをドラッグ移動する処理がうまくいきません。
ドラッグ移動はできるものの、画面を回転させたり、アプリを再起動したりすると元の状態に戻ってしまいます。
スワイプ処理はリストの削除となっており、こちらは正常に機能しております。

ソースコード

Java

1  public class MainActivity extends AppCompatActivity { 2 3 private RecyclerViewOpenHelper helper = null; 4 private List<Columns> myDataset = new ArrayList<>(); 5 private RecyclerView recyclerView; 6 private RecyclerViewAdapter mAdapter; 7 private RecyclerView.LayoutManager layoutManager; 8 private RecyclerView.ItemDecoration itemDecoration; 9 10  ~中略~ 11 12 //データベースから値を取得しデータセットにセットしています。 13     SQLiteDatabase db = helper.getWritableDatabase(); 14 try { 15 Cursor c = db.rawQuery("SELECT id, date, body FROM MEMO_TABLE", null); 16 boolean next = c.moveToFirst(); 17 18 while (next) { 19 Columns columns = new Columns(); 20 long id = Long.parseLong(c.getString(0)); 21 String date = c.getString(1); 22 String body = c.getString(2); 23 if(body.length() > 9) { 24 body = body.substring(0, 10) + "..."; 25 } 26 columns.setBody(body); 27 columns.setDate(date); 28 columns.setId(id); 29 30 myDataset.add(columns); 31 next = c.moveToNext(); 32 } 33 } finally { 34 db.close(); 35 } 36 37  ~中略~ 38 39    ItemTouchHelper itemTouchHelper = new ItemTouchHelper( 40 new SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 41 ItemTouchHelper.LEFT) { 42 43 @Override 44 public boolean onMove(@NonNull RecyclerView recyclerView, 45 @NonNull RecyclerView.ViewHolder viewHolder, 46 @NonNull RecyclerView.ViewHolder target) { 47 final int fromPos = viewHolder.getAdapterPosition(); 48 final int toPos = target.getAdapterPosition(); 49 myDataset.add(toPos, myDataset.remove(fromPos));//←これで保存されないのが謎です。 50 mAdapter.notifyItemMoved(fromPos, toPos); 51 return true; 52 } 53 54 @Override 55 public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { 56 final int fromPos = viewHolder.getAdapterPosition(); 57 long id = mAdapter.getItemId(fromPos); 58 SQLiteDatabase db = helper.getWritableDatabase(); 59 try { 60 db.delete("MEMO_TABLE", "id = ?", new String[]{String.valueOf(id)}); 61 } 62 finally { 63 db.close(); 64 } 65 myDataset.remove(fromPos); 66 mAdapter.notifyItemRemoved(fromPos); 67 } 68 } 69 ); 70 itemTouchHelper.attachToRecyclerView(recyclerView);

独自作成クラス

Java

1public class Columns { 2 3 private long id; 4 private String date; 5 private String body; 6 7 public long getId() { return id; } 8 public String getDate() { return date; } 9 public String getBody() { return body; } 10 public void setId(long id) { this.id = id; } 11 public void setDate(String date) { this.date = date; } 12 public void setBody(String body) { this.body = body; } 13}

このColumnsに問題があるのでしょうか...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/04/22 09:42

myDataset は単なるメモリ上のコピーに過ぎませんので、myDataset.add(toPos, myDataset.remove(fromPos)); ではデータベースの内容は変化しません。 SQLite のデータベース自体には順番という概念はなく、何らかの条件をもとに SELECT の際に ORDER BY で順番を指定します。ので、順番を保存したいのであれば、そのためのカラムをデータベース上に持つ必要があります。
Peanuts888

2020/04/27 11:47

回答ありがとうございます。 ここ数日間回答を参考にしてレコードの内容を入れ替える方法を模索しておりました。 ようやくうまくいきそうな方法にたどり着いたので実行してみたところ別のエラーで詰まってしまいました。 エラー文とDB処理文を追記したのでご覧いただけますか?
guest

回答1

0

自己解決

頂いた回答を参考にDB処理を追加したところ、ドラッグの結果が保存されるようになりました!

Java

1@Override 2 public boolean onMove(@NonNull RecyclerView recyclerView, 3 @NonNull RecyclerView.ViewHolder viewHolder, 4 @NonNull RecyclerView.ViewHolder target) { 5 final int fromPos = viewHolder.getAdapterPosition(); 6 final int toPos = target.getAdapterPosition(); 7 myDataset.add(toPos, myDataset.remove(fromPos)); 8 SQLiteDatabase db = helper.getWritableDatabase(); 9 try { 10 Cursor c = db.rawQuery("SELECT body, date FROM MemoTable ORDER BY id", null); 11 c.moveToPosition(fromPos); 12 String bodyF = c.getString(0); 13 String dateF = c.getString(1); 14 c.moveToPosition(toPos); 15 String bodyT = c.getString(0); 16 String dateT = c.getString(1); 17 int fpPlus = fromPos +1; 18 int tpPlus = toPos +1; 19 db.execSQL("UPDATE MemoTable SET body = '"+ bodyF +"', date = '"+ dateF +"'WHERE id = "+ tpPlus +""); 20 db.execSQL("UPDATE MemoTable SET body = '"+ bodyT +"', date = '"+ dateT +"'WHERE id = "+ fpPlus +""); 21 } finally { db.close(); } 22 mAdapter.notifyItemMoved(fromPos, toPos); 23 return true; 24 }

投稿2020/04/28 02:19

Peanuts888

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問