前回の動画で、リサイクラービュー、そしてデータベースRealmを使って、名前と年齢が登録できる、簡単な名簿アプリが作れるようになりました

今回はその続きです。追加したリストをタッチして、編集したり削除したりできる機能を設置したいと思います。

動画

目次

タイトル 再生時間
[21]タッチされたらintent 04:20~
[22]値を受け取る(getExtra) 12:05~
[23]SAVEボタンが押されたら~(ifで条件分岐) 22:35~
[24]削除ボタンが押されたら~ 25:50~
[25]完成 28:40~

コード

activity_main.xml(前回と同じ)

MainActivity.kt(前回と同じ)

build.gradle(project)(前回と同じ)

build.gradle(app)(前回と同じ

CustomApplication.kt(前回と同じ)

AndroidManifest.xml(前回と同じ)

activity_edit.xml(前回と同じ)

▼EditActivity.kt

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()
    }
}

MyModel.kt(前回と同じ)

one_layout.xml(前回と同じ)

ViewHolderItem.kt(前回と同じ)

▼RecyclerAdapter.kt

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
    }
}

参考

Install Realm – Java SDK

RecyclerViewがViewHolder内に保存されているビューにアクセスする必要がある場合は、ビューホルダーのitemViewプロパティを使うことでアクセスすることができます

itとthisとラムダ式

 

    コメントを残す