前回の動画で、リサイクラービュー、そしてデータベースRealmを使って、名前と年齢が登録できる、簡単な名簿アプリが作れるようになりました。
今回はその続きです。追加したリストをタッチして、編集したり削除したりできる機能を設置したいと思います。
動画
目次
タイトル | 再生時間 |
[21]タッチされたらintent | 04:20~ |
[22]値を受け取る(getExtra) | 12:05~ |
[23]SAVEボタンが押されたら~(ifで条件分岐) | 22:35~ |
[24]削除ボタンが押されたら~ | 25:50~ |
[25]完成 | 28:40~ |
コード
▼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()
}
}
▼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
}
}
参考
RecyclerViewがViewHolder内に保存されているビューにアクセスする必要がある場合は、ビューホルダーのitemViewプロパティを使うことでアクセスすることができます