質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

解決済

DBと連携したListViewを更新したい

tokumei000
tokumei000

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

2回答

0評価

0クリップ

936閲覧

投稿2020/02/25 12:15

前提・実現したいこと

DBに保存したアイテム名を一覧で表示させるアプリを作っています。
FABを押した時に現れるダイアログからアイテムを追加できます。

現れたダイアログからアイテムを追加して元の画面が表示された時に一覧を更新できるようにしたいのですが、実装方法がわからないため質問させていただきました。

発生している問題・エラーメッセージ

ListViewに表示する際は以下の手順で行っています。

  1. DBにアクセスし全アイテム名を取得してリストに格納する
  2. アイテム名を格納したリストとリストビューをArrayAdapterで紐付ける

そのため画面を更新するには以下の手順で行えばいいと考えました。

  1. 一旦アイテム名を格納したリストを空にする
  2. DBにアクセスし全アイテム名を取得してリストに格納する
  3. 画面の更新(adapter.notifyDataSetChanged())

これをダイアログを定義しているAddDialog.kt内のPositiveButtonの処理を記述している部分に書こうと思ったのですが、どうやってMainActivity内のリストやアダプタを呼び出せばいいかわかりませんでした。

また、他の方法として、ダイアログが消えて元の画面が表示されたことを検知できればMainActivity内に記述できるかもと思い色々模索してみたのですが、検知する方法がわかりませんでした。

知りたいことをまとめると以下の通りです
・AddDialog.kt内でMainActivity内のリストやアダプタを参照する方法(そもそもできるのかどうかも含めて)
・ダイアログが消えて元の画面が表示されたことを検知する方法(そもそもできるのかどうかも含めて)
・上記2点が無理な場合どのようにして画面を更新すればよいか

よろしくおねがいします。

該当のソースコード

MainActivity.kt

kotlin

class MainActivity : AppCompatActivity() { private val _helper = DatabaseHelper(this@MainActivity) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val fab: View = findViewById(R.id.fab) fab.setOnClickListener(object: View.OnClickListener{ override fun onClick(v: View?) { val dialog = AddDialog() dialog.show(supportFragmentManager, "AddDialog") } }) val lv = findViewById<ListView>(R.id.lv) var itemsList : MutableList<String> = mutableListOf() val db = _helper.writableDatabase val sql = "SELECT * FROM items" var cursor = db.rawQuery(sql, null) val idxItems_name = cursor.getColumnIndex("items_name") while(cursor.moveToNext()){ itemsList.add(cursor.getString(idxItems_name)) } val adapter = ArrayAdapter<String>(applicationContext, android.R.layout.simple_list_item_1, itemsList) lv.adapter = adapter } override fun onDestroy() { _helper.close() super.onDestroy() } }

AddDialog.kt

kotlin

class AddDialog: DialogFragment(){ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val editText = EditText(activity) val _helper = DatabaseHelper(activity as Context) val builder = AlertDialog.Builder(activity) builder.setTitle(R.string.add_dialog_title) builder.setView(editText) builder.setPositiveButton("追加", object :DialogInterface.OnClickListener{ override fun onClick(dialog: DialogInterface?, which: Int) { when(which){ DialogInterface.BUTTON_POSITIVE->{ val addItem = editText.text.toString() if(addItem.length != 0) { val db = _helper.writableDatabase val sqlCheck = "SELECT * FROM items WHERE items_name = ?" val parms = arrayOf(addItem) val cursor = db.rawQuery(sqlCheck, parms) //存在チェック if(cursor.moveToNext() == true){ Toast.makeText(activity, "すでに存在します", Toast.LENGTH_SHORT).show() } else{ val sqlInsert = "INSERT INTO items (items_name) VALUES (?)" var stmt = db.compileStatement(sqlInsert) stmt.bindString(1, addItem) stmt.executeInsert() Toast.makeText(activity, "追加しました", Toast.LENGTH_SHORT).show() } } else{ Toast.makeText(activity, "アイテムを入力してください", Toast.LENGTH_SHORT).show() } } } } }) builder.setNegativeButton("キャンセル", object :DialogInterface.OnClickListener{ override fun onClick(dialog: DialogInterface?, which: Int) { Toast.makeText(activity, "キャンセルしました", Toast.LENGTH_SHORT).show() } }) val dialog = builder.create() return dialog } }

アプリ画面

起動時
FAB押した時

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。