前提・実現したいこと
DBに保存したアイテム名を一覧で表示させるアプリを作っています。
FABを押した時に現れるダイアログからアイテムを追加できます。
現れたダイアログからアイテムを追加して元の画面が表示された時に一覧を更新できるようにしたいのですが、実装方法がわからないため質問させていただきました。
発生している問題・エラーメッセージ
ListViewに表示する際は以下の手順で行っています。
- DBにアクセスし全アイテム名を取得してリストに格納する
- アイテム名を格納したリストとリストビューをArrayAdapterで紐付ける
そのため画面を更新するには以下の手順で行えばいいと考えました。
- 一旦アイテム名を格納したリストを空にする
- DBにアクセスし全アイテム名を取得してリストに格納する
- 画面の更新(adapter.notifyDataSetChanged())
これをダイアログを定義しているAddDialog.kt内のPositiveButtonの処理を記述している部分に書こうと思ったのですが、どうやってMainActivity内のリストやアダプタを呼び出せばいいかわかりませんでした。
また、他の方法として、ダイアログが消えて元の画面が表示されたことを検知できればMainActivity内に記述できるかもと思い色々模索してみたのですが、検知する方法がわかりませんでした。
知りたいことをまとめると以下の通りです
・AddDialog.kt内でMainActivity内のリストやアダプタを参照する方法(そもそもできるのかどうかも含めて)
・ダイアログが消えて元の画面が表示されたことを検知する方法(そもそもできるのかどうかも含めて)
・上記2点が無理な場合どのようにして画面を更新すればよいか
よろしくおねがいします。
該当のソースコード
MainActivity.kt
kotlin
1class MainActivity : AppCompatActivity() { 2 3 private val _helper = DatabaseHelper(this@MainActivity) 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 setContentView(R.layout.activity_main) 8 9 val fab: View = findViewById(R.id.fab) 10 fab.setOnClickListener(object: View.OnClickListener{ 11 override fun onClick(v: View?) { 12 val dialog = AddDialog() 13 dialog.show(supportFragmentManager, "AddDialog") 14 } 15 }) 16 17 val lv = findViewById<ListView>(R.id.lv) 18 19 var itemsList : MutableList<String> = mutableListOf() 20 val db = _helper.writableDatabase 21 val sql = "SELECT * FROM items" 22 var cursor = db.rawQuery(sql, null) 23 24 val idxItems_name = cursor.getColumnIndex("items_name") 25 26 while(cursor.moveToNext()){ 27 itemsList.add(cursor.getString(idxItems_name)) 28 } 29 30 val adapter = ArrayAdapter<String>(applicationContext, android.R.layout.simple_list_item_1, itemsList) 31 lv.adapter = adapter 32 } 33 34 override fun onDestroy() { 35 _helper.close() 36 super.onDestroy() 37 } 38} 39
AddDialog.kt
kotlin
1class AddDialog: DialogFragment(){ 2 3 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 4 5 val editText = EditText(activity) 6 val _helper = DatabaseHelper(activity as Context) 7 8 val builder = AlertDialog.Builder(activity) 9 builder.setTitle(R.string.add_dialog_title) 10 builder.setView(editText) 11 12 builder.setPositiveButton("追加", object :DialogInterface.OnClickListener{ 13 override fun onClick(dialog: DialogInterface?, which: Int) { 14 when(which){ 15 DialogInterface.BUTTON_POSITIVE->{ 16 val addItem = editText.text.toString() 17 if(addItem.length != 0) { 18 19 val db = _helper.writableDatabase 20 21 val sqlCheck = "SELECT * FROM items WHERE items_name = ?" 22 val parms = arrayOf(addItem) 23 val cursor = db.rawQuery(sqlCheck, parms) 24 25 //存在チェック 26 if(cursor.moveToNext() == true){ 27 Toast.makeText(activity, "すでに存在します", Toast.LENGTH_SHORT).show() 28 } 29 else{ 30 val sqlInsert = "INSERT INTO items (items_name) VALUES (?)" 31 var stmt = db.compileStatement(sqlInsert) 32 stmt.bindString(1, addItem) 33 stmt.executeInsert() 34 35 Toast.makeText(activity, "追加しました", Toast.LENGTH_SHORT).show() 36 } 37 } 38 else{ 39 Toast.makeText(activity, "アイテムを入力してください", Toast.LENGTH_SHORT).show() 40 } 41 42 } 43 } 44 } 45 }) 46 47 builder.setNegativeButton("キャンセル", object :DialogInterface.OnClickListener{ 48 override fun onClick(dialog: DialogInterface?, which: Int) { 49 Toast.makeText(activity, "キャンセルしました", Toast.LENGTH_SHORT).show() 50 } 51 }) 52 53 val dialog = builder.create() 54 return dialog 55 } 56}
アプリ画面
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/25 12:39
2020/02/25 12:41
2020/02/25 12:45
2020/02/27 11:28 編集
2020/02/26 23:52
2020/02/27 11:28
2020/12/23 14:43