前提・実現したいこと
ListViewの再描画
現在、ListViewを使用したシンプルなメモアプリを作成しています。
やりたいこととしましては、ListViewを長押し(長押しの実装はできております)して、編集を行い、上書きをしたいと思っております。それと合わせて複数行を表示出来るようにしたいと思っております。後一度ListViewに記載したものは、削除するまでアプリを閉じても表示しておきたいです。
今現在実装出来ていることは、皆様の助けもあり、ListViewに追加と同時にrealmに保存と、
タップの際にアラートダイアログを表示し、削除するかしないかの選択はできております。
最終的には、複数行表示し、Todoアプリを作りたいと考えております。
該当のソースコード
MainActivity
1class MainActivity : AppCompatActivity() { 2 override fun onCreate(savedInstanceState: Bundle?) { 3 super.onCreate(savedInstanceState) 4 setContentView(R.layout.activity_main) 5 6 val et_name : EditText = findViewById(R.id.et_name) 7 val bt_add : Button = findViewById(R.id.bt_add) 8 val bt_delete : Button = findViewById(R.id.bt_delete) 9 val lv : ListView = findViewById(R.id.lv) 10 11 val adapter = ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1, 12 mutableListOf()) 13 lv.adapter = adapter 14 15 //Realmを使う時に必要 16 val realm = Realm.getDefaultInstance() 17 18 //bt_addを押すとet_nameに入力した内容をDBに保存とListViewに表示する処理を記載する 19 bt_add.setOnClickListener { 20 if ( et_name.text.toString().isEmpty()){ 21 AlertDialog.Builder(this) 22 .setTitle("未入力") 23 .setMessage("名前を入力して下さい") 24 .setPositiveButton("OK",null) 25 .show()//et_nameが未入力の場合、アラートダイアログで表示 26 }else{ 27 realm.beginTransaction()//Realmのはじまり 28 try { 29 val user = realm.createObject(user::class.java) 30 user.setName(et_name.text.toString())//DBに書き込み 31 et_name.text.clear()//DBに書き込みしたらEditTextの文字をクリアする 32 Toast.makeText(applicationContext,"登録しました",Toast.LENGTH_SHORT).show()//トーストで表示 33 realm.commitTransaction() 34 adapter.add(user.getName())//et_nameの内容をListViewに追加する 35 }catch (e:RealmException){} 36 } 37 } 38 39 //ListViewをタップするとアラートダイアログを表示して、削除するかしないか判断する 40 //合わせてDBに登録されているデータも一緒に削除する 41 lv.setOnItemClickListener { parent, view, position, id -> 42 AlertDialog.Builder(this) 43 .setTitle("削除しますか??") 44 //Yesを押下した時の処理 45 //タップされたところの名前を削除とDBの削除 46 .setPositiveButton("Yes", DialogInterface.OnClickListener { dialog, which -> 47 //ListViewのタップした行のDBを削除する処理 48 realm.beginTransaction() 49 val delete = 50 adapter.getItem(id.toInt())//このコードでListViewの~行目のタップした文字を取得 //getItemIdだと何番目のListviewか取得できる 51 val realm_delete = realm.where(user::class.java).equalTo("name", delete) 52 .findAll()//ここで検索をかけて、realm_deleteに格納する(削除対象を取得) 53 realm_delete.deleteFirstFromRealm() 54 realm.commitTransaction() 55 et_name.text.clear() 56 //ListViewのタップした行を削除する処理 57 adapter.remove(adapter.getItem(id.toInt())) 58 adapter.notifyDataSetChanged() 59 Toast.makeText(applicationContext, "削除しました", Toast.LENGTH_SHORT).show() 60 }) 61 .setNegativeButton("No", DialogInterface.OnClickListener { dialog, which -> 62 Toast.makeText(applicationContext, "キャンセルしました", Toast.LENGTH_SHORT).show() 63 }) 64 .show() 65 } 66 //DBとListViewの項目全削除用 67 bt_delete.setOnClickListener { 68 AlertDialog.Builder(this) 69 .setTitle("項目の全削除") 70 .setMessage("項目を全て削除しますか?") 71 .setPositiveButton("削除",DialogInterface.OnClickListener { dialog, which -> 72 realm.beginTransaction() 73 realm.where(user::class.java).findAll().deleteAllFromRealm() 74 realm.commitTransaction() 75 adapter.remove(adapter.clear().toString()) 76 Toast.makeText(applicationContext,"全ての項目を削除しました",Toast.LENGTH_SHORT).show() 77 }) 78 .setNegativeButton("キャンセルする",null) 79 .show() 80 } 81 82 //項目の編集 83 //ListViewを長押しするとアラートダイアログを表示し、そこで入力した内容を上書きする 84 lv.setOnItemLongClickListener { parent, view, position, id -> 85 val et = EditText(this) 86 val item_word = adapter.getItem(id.toInt()) 87 et.setText(item_word)//編集画面を出したときに、入力してある文字をetに表示しておく 88 AlertDialog.Builder(this) 89 .setTitle("項目の編集") 90 .setMessage("編集しよう!!") 91 .setView(et) 92 .setPositiveButton("編集する",DialogInterface.OnClickListener { dialog, which -> 93 //ここに編集するコードを書きたい 94 Toast.makeText(applicationContext,"${item_word}",Toast.LENGTH_SHORT).show() 95 }).show() 96 true 97 } 98 } 99}
MainActivityXML
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 10 <EditText 11 android:id="@+id/et_name" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" 14 android:ems="10" 15 android:inputType="textPersonName" 16 android:hint="name" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20 <Button 21 android:id="@+id/bt_add" 22 android:layout_width="wrap_content" 23 android:layout_height="wrap_content" 24 android:text="add" 25 app:layout_constraintEnd_toEndOf="parent" 26 app:layout_constraintTop_toBottomOf="@+id/et_name" /> 27 28 <ListView 29 android:id="@+id/lv" 30 android:layout_width="409dp" 31 android:layout_height="636dp" 32 android:layout_marginStart="1dp" 33 android:layout_marginTop="1dp" 34 android:layout_marginEnd="1dp" 35 app:layout_constraintEnd_toEndOf="parent" 36 app:layout_constraintStart_toStartOf="parent" 37 app:layout_constraintTop_toBottomOf="@+id/bt_add" /> 38 39 <Button 40 android:id="@+id/bt_delete" 41 android:layout_width="wrap_content" 42 android:layout_height="wrap_content" 43 android:text="delete" 44 app:layout_constraintEnd_toStartOf="@+id/bt_add" 45 app:layout_constraintTop_toBottomOf="@+id/et_name" /> 46 47</androidx.constraintlayout.widget.ConstraintLayout>
user
1package com.example.realm_listview_app 2 3import io.realm.Realm 4import io.realm.RealmObject 5 6open class user : RealmObject(){ 7 private var name : String = "" 8 9 fun setName(name:String){ 10 this.name = name 11 } 12 13 fun getName():String{ 14 return name 15 } 16 17}
試したこと
初心者なりに考えたのは、編集が終わった後に、一旦その長押しした行番号を取得して、その行番号に追加なら出来るのではないかと思ったのですが、うまく出来ませんでした(私の知識不足だと思います)。
複数行はMapofを使えばいけると思ったのですが、追加がうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
Android Studio Arctic Fox | 2020.3.1 Patch 1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/26 17:38
退会済みユーザー
2021/11/29 02:41