
前回の動画で、リサイクラービュー、そしてデータベースRealmを使って、名前と年齢が登録できる、簡単な名簿アプリが作れるようになりました。
今回はその続きです。追加したリストをタッチして、編集したり削除したりできる機能を設置したいと思います。
動画
目次
タイトル | 再生時間 |
[21]タッチされたらintent | 04:20~ |
[22]値を受け取る(getExtra) | 12:05~ |
[23]SAVEボタンが押されたら~(ifで条件分岐) | 22:35~ |
[24]削除ボタンが押されたら~ | 25:50~ |
[25]完成 | 28:40~ |
コード
▼EditActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | package com.example.realmnamelistapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Button import android.widget.EditText import android.widget.TextView import android.widget.Toast import io.realm.Realm import io.realm.kotlin.createObject import io.realm.kotlin.where class EditActivity : AppCompatActivity() { //8)Realmの変数宣言 private lateinit var realm :Realm override fun onCreate(savedInstanceState: Bundle?) { super .onCreate(savedInstanceState) setContentView(R.layout.activity_edit) //4)Viewの取得 //val etName:EditText = findViewById(R.id.etName) //val etAge:EditText = findViewById(R.id.etAge) val etName:TextView = findViewById(R.id.etName) //最後にテキストで表示するのに使うのでTextView val etAge:TextView = findViewById(R.id.etAge) //最後にテキストで表示するのに使うのでTextView val btnSave:Button = findViewById(R.id.btnSave) val btnDel:Button = findViewById(R.id.btnDel) //8)ここでもRealmインスタンスを生成 realm = Realm.getDefaultInstance() //22)intentを受け取る⇒値を表示 val getId = intent.getLongExtra( "ID" ,0L) if (getId> 0 ){ //既存のレコードが存在するので、一致するidを取得(して表示) val myModelResult = realm.where<MyModel>() .equalTo( "id" ,getId).findFirst() //該当する一番最初のデータを取り出します //該当するidのnameとageを表示 etName.text = myModelResult?.name.toString() //4)でTextViewにしたのはココで表示させるため etAge.text = myModelResult?.age.toString() btnDel.visibility = View.VISIBLE //削除ボタン表示 } else { //まだデータが存在しないので、削除ボタンは非表示にする btnDel.visibility = View.INVISIBLE } //9)Saveボタンを押したら~ btnSave.setOnClickListener { //上書き用の変数を用意 var name:String = "" var age :Long = 0 //10)入力された文字が空文字でなければ~(変数に代入) if (!etName.text.isNullOrEmpty()){ name =etName.text.toString() } if (!etAge.text.isNullOrEmpty()){ age=etAge.text.toString().toLong() } //11)【DBに書き込みますよ】 / Transaction{} //23)条件分岐(idが0なら新規追加、それ以外は上書き) if (getId ==0L){ //0Lの場合(新規追加) realm.executeTransaction { val currentId = realm.where<MyModel>().max( "id" ) //現時点のid(の最高値)を取得 val nextId =(currentId?.toLong() ?:0L)+1L //最高値に1を追加(最高値が0なら1に)←行を追加するイメージ //モデルクラス(nextId番目)に値をセット val myModel =realm.createObject<MyModel>(nextId) myModel.name = name myModel.age = age } } else { //そうじゃない場合(上書き) realm.executeTransaction { val myModel = realm.where<MyModel>() .equalTo( "id" ,getId).findFirst() myModel?.name = name myModel?.age = age } } //12)toastでメッセージを表示 Toast.makeText(applicationContext, "保存しました" ,Toast.LENGTH_SHORT).show() finish() } //24)deleteボタンが押されたら~ btnDel.setOnClickListener { realm.executeTransaction { //一致するidを探して、delete realm.where<MyModel>() .equalTo( "id" ,getId) .findFirst()?.deleteFromRealm() } Toast.makeText(applicationContext, "削除しました" ,Toast.LENGTH_SHORT).show() finish() } } //8)Realm閉じる override fun onDestroy() { super .onDestroy() realm.close() } } |
▼RecyclerAdapter.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package com.example.realmnamelistapp import android.content.Intent import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import io.realm.RealmResults //15)Adapter //17-1)結果を受け取る引数(=受け皿)RealmResults ← 登録データ全件(Realmクエリの実行結果)を取得する class RecyclerAdapter(realmResults:RealmResults<MyModel>):RecyclerView.Adapter<ViewHolderItem>() { //17-2)RecyclerAdapter()の引数realmResultsを展開していく変数を用意 private val rResults:RealmResults<MyModel> =realmResults //16)1行だけのレイアウト表示 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderItem { val oneXml = LayoutInflater.from(parent.context) .inflate(R.layout.one_layout,parent, false ) return ViewHolderItem(oneXml) } //17-3)position番目のデータを表示 override fun onBindViewHolder(holder: ViewHolderItem, position: Int) { val myModel = rResults[position] //position番目の結果を取得 holder.oneTvName.text = myModel?.name.toString() //position番目のnameを代入 holder.oneTvAge.text = myModel?.age.toString() //position番目のageを代入 //21)クリック処理(1行分の画面(view)が押されたら~) //ViewHolderのitemViewプロパティを使うことでViewにアクセスできる holder.itemView.setOnClickListener { val intent = Intent(it.context,EditActivity:: class .java) //it はRecyclerViewで定義されたレイアウトView intent.putExtra( "ID" ,myModel?.id) //idを渡す it.context.startActivity(intent) } } //18)リスト(=結果件数)の件数(=サイズ) override fun getItemCount(): Int { return rResults.size } } |
参考
RecyclerViewがViewHolder内に保存されているビューにアクセスする必要がある場合は、ビューホルダーのitemViewプロパティを使うことでアクセスすることができます