

# やりたいこと

Kotlinで「ListViewの各項目をタップすると、その項目に対応した内容の詳細画面が表示される」という流れを作りたいです。

  1. タップした項目が持つid(PrimaryKey)を詳細画面の方に渡す
  2. 詳細画面は受け取ったidからデータベースを検索し対応するレコードの値をすべて表示する

# 問題点

タップした項目が持つidを取得し詳細画面に渡す方法がわかりません

# 現状

putExtraで適当なテキストを送り、詳細画面でトースト表示させています

# コード(一部抜粋)

MainActivity.kt

[code]

    // 各項目をタップ → 詳細画面に遷移
    MainListView.setOnItemClickListener{_, _, _, _ ->
        val intent: Intent = Intent(this, DetailActivity::class.java)
        intent.putExtra("TapID", "タップした項目のID")
        startActivity(intent)
    }
    
[/code]

DetailActivity.kt

[code]

    class DetailActivity : AppCompatActivity(){
        override fun onCreate(savedInstanceState: Bundle?){
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_detail)
    
            Toast.makeText(this, "${intent.extras.get("TapID")}", Toast.LENGTH_SHORT).show()
        }
    }
    
[/code]


CC BY-SA 4.0
2018-06-08T03:22:28.373
44610
2022-08-03T16:06:00.597
2018-06-11T01:02:13.307
28635
28635
question
android database kotlin android-intent
画面遷移の際にデータベースのidを渡す方法がわかりません


`intent`に向けて`ExtraData`を`put`しているので、  
遷移先で取得する際は`Intent`を取得して、`intent`から`ExtraData`を`get`してください。

DetailActivity.kt

[code]

    class DetailActivity : AppCompatActivity(){
        override fun onCreate(savedInstanceState: Bundle?){
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_detail)
    
            Intent intent = getIntent();
            String tapid = intent.getStringExtra("TapID");
            Toast.makeText(this, tapid, Toast.LENGTH_SHORT).show()
        }
    }
    
[/code]


CC BY-SA 4.0
2018-06-11T07:40:54.163
44684
2018-06-11T07:40:54.163
44610
answer


ListView を使っているということは、その ListView に Adapter を渡していると思います。

Adapter として ArrayAdapter を使っているのであれば、ArrayAdapter
に何らかの配列を渡していると思います。その配列の要素の中にレコードの id が必要です。

以下のようにすると、ArrayAdapter に渡してある配列の中の該当要素を取得することができ、  
その要素から id を取得することができます。

[code]

    MainListView.setOnItemClickListener { parent, _, position, _ ->
        // 該当の要素を取得
        val listView = parent as ListView
        val item = listView.getItemAtPosition(position) as Item     // 該当要素を取得
    
        // id を渡す
        val intent: Intent = Intent(this, DetailActivity::class.java)
        intent.putExtra("TapID", item.id)                           // 該当要素から id を取得して intent にセット
        startActivity(intent)
    }
    
[/code]

(`Item` は配列の要素の型に読み替えてください)

* * *

コメントを受けて追記します。

ArrayAdapter に String[] を渡しているということでしょうか?  
であれば、String に id を持たせることはできませんので、以下のように修正が必要になります。

まず、Item クラスを定義します。

[code]

    private inner class Item(val id: Long, val name: String) {
        override fun toString(): String {
            return name
        }
    }
    
[/code]

これで、ListView に表示する文字列とデータベースの id をペアにして扱うことができます。

次に、今、

[code]

    string_array = emptyMutableListOf<String>()
    string_array.add(1つめの文字列)
    string_array.add(2つめの文字列)
    // ...
    
    adapter = ArrayAdapter<String>(context, resource, string_array);
    
[/code]

という感じで ArrayAdapter を作っていると思いますので、

[code]

    item_array = emptyMutableListOf<Item>()
    item_array.add(Item(1つ目のid, 1つめの文字列))
    item_array.add(Item(2つ目のid, 2つめの文字列))
    // ...
    
    adapter = ArrayAdapter<Item>(context, resource, item_array);
    
[/code]

というように、Item の配列(上記コードではリストになっていますが、どちらでも大丈夫のはずです)を渡すように変更します。

そして、この adapter を使った ListView なら、

[code]

    MainListView.setOnItemClickListener { parent, _, position, _ ->
        // 該当の要素を取得
        val listView = parent as ListView
        val item = listView.getItemAtPosition(position) as Item         // 該当要素を取得
    
        // id を渡す
        val intent: Intent = Intent(this, DetailActivity::class.java)
        intent.putExtra("TapID", item.id)                               // 該当要素から id を取得して intent にセット
        startActivity(intent)
    }
    
[/code]

というように item から id が取得できます。

他にも手を加える必要のある箇所が出てくるかもしれませんが、適宜修正してください。

(こちらの `Item` は `String` に読み替えないで下さい)


CC BY-SA 4.0
2018-06-11T14:15:54.450
44700
2018-06-16T15:31:06.963
2018-06-16T15:31:06.963
5288
5288
44610
answer