前提・実現したいこと
kotlinでAndroidのtodoアプリを作っています。リスト項目の並び替えをItemTouchHelper.SimpleCallbackを使って実装したいのですが、上下の並び替えが上手く出来ません(onMove()のオーバーライド)。
ちなみにonSwiped()は動いています。
発生している問題・エラーメッセージ
add()を使ってもdeprecatedの実行エラーが出てしまいます。RealmResultのreferenceを見る限りその他にRealmResultの特定の位置に要素を挿入するようなメソッドが見つからず困っています。
どなたかよろしくお願いいたします。
kotlin
1package com.example.simpletodo 2 3import androidx.appcompat.app.AppCompatActivity 4import android.os.Bundle 5import android.widget.CheckBox 6import androidx.recyclerview.widget.ItemTouchHelper 7import androidx.recyclerview.widget.LinearLayoutManager 8import androidx.recyclerview.widget.RecyclerView 9import io.realm.Realm 10import io.realm.kotlin.createObject 11import io.realm.kotlin.where 12import kotlinx.android.synthetic.main.activity_main.* 13import kotlinx.android.synthetic.main.todo_list_row.* 14 15class MainActivity : AppCompatActivity() { 16 private lateinit var realm: Realm 17 18 override fun onCreate(savedInstanceState: Bundle?) { 19 super.onCreate(savedInstanceState) 20 setContentView(R.layout.activity_main) 21 supportActionBar?.hide() 22 realm = Realm.getDefaultInstance() 23 list.layoutManager = LinearLayoutManager(this) 24 //TodoのCollectionを返す 25 val todos = realm.where<Todo>().findAll() 26 val adapter = TodoAdapter(todos) 27 list.adapter = adapter 28 29 //saveボタン押下時に、新しいtodoを登録 30 save.setOnClickListener { 31 realm.executeTransaction { 32 val maxId = it.where<Todo>().max("id") 33 val nextId = (maxId?.toLong() ?: 0L) + 1 34 //Primary Keyを与えて、引数型のオブジェクトを生成する 35 val newTodo = it.createObject<Todo>(nextId) 36 newTodo.todo = addTodo.text.toString() 37 } 38 } 39 40 //fab押下時、チェック済みのtodoを一括削除 41 fab.setOnClickListener { 42 if (checkBox.isChecked) { 43 44 } 45 } 46 47 //ItemTouchHelper 48 val itHelper = ItemTouchHelper( 49 object: ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP or ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) { 50 override fun onMove( 51 recyclerView: RecyclerView, 52 viewHolder: RecyclerView.ViewHolder, 53 target: RecyclerView.ViewHolder 54 ): Boolean { 55 val fromPosition = viewHolder?.adapterPosition 56 val toPosition = target?.adapterPosition 57 58 realm.executeTransaction { 59 todos.deleteFromRealm(fromPosition) 60 //ここでドロップ位置にドラッグしている項目を挿入したいです 61 62 } 63 //Adapterにドラッグアンドドロップされたことを通知します。 64 adapter.notifyItemMoved(fromPosition, toPosition) 65 return true 66 } 67 68 69 override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { 70 viewHolder.let { 71 realm.executeTransaction { 72 todos.deleteFromRealm(viewHolder.adapterPosition) 73 } 74 adapter.notifyItemRemoved(viewHolder.adapterPosition) 75 } 76 } 77 78 } 79 ) 80 itHelper.attachToRecyclerView(list) 81 82 }
あなたの回答
tips
プレビュー