【kotlin】ListViewで値を渡して画面遷移

###前記事の【kotlin】ListView 2行表示　SimpleAdapterのサンプルアプリを応用します。

``` kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val lvMenu = findViewById<ListView>(R.id.ivMenu)
        val menuList: MutableList<MutableMap<String,String>> = mutableListOf()

        var menu = mutableMapOf("name" to "ピカチュウ","price" to "800円")
        menuList.add(menu)

        menu = mutableMapOf("name" to "ヒトカゲ","price" to "850円")
        menuList.add(menu)

        menu = mutableMapOf("name" to "カメックス","price" to "12000円")
        menuList.add(menu)

        val from = arrayOf("name","price")
        val to = intArrayOf(android.R.id.text1,android.R.id.text2)
        val adapter = SimpleAdapter(this@MainActivity,menuList,android.R.layout.simple_list_item_2,from, to)
        lvMenu.adapter = adapter

        lvMenu.onItemClickListener = ListItemClick()
    }

```

![スクリーンショット 2021-06-07 22.21.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/fdca4760-2cb9-929f-3b6b-b3cd62c5911d.png)


#■画面遷移

###1　画面を追加する。
画面遷移先の画面を新しく作る。
AndoroidStudio [File]
[New] -> [Activity] -> [Empty Activity]
Name:MenuActivity(好きな名前)

MenuActivity.kt(画面)
activity_menu.xml(レイアウト)
ができる。

画面遷移先のレイアウトを作る。

###2 MainActivityに画面遷移のコードを書きます。
リストビューのクリックイベントのリスナクラスを作る。

``` kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
   //省略
    }
 
//リストビューのクリックイベントが起こるリスナクラス  
private inner class ListItemClick: AdapterView.OnitemClickListener {
  override fun onItemClick(parent: AdapterView<*>, view:View,position: Int, id: Long){ 
  } 
 }
}
```


###3 タップされた行のデータを取得
parent リスト全体
position 選択された行の番号

■parent.getItemAtPosition(position) 
リストの選択された行を取得


■as MutableMap<string,string>
選択された行の型にキャストする。
1行分はMutableListではなくMutableMap型です。
MutableListはリストビュー全体のデータにあたります。

``` kotlin
private inner class ListItemClick: AdapterView.OnitemClickListener {
  override fun onItemClick(parent: AdapterView<*>, view:View,position: Int, id: Long){ 
    //選択された行を取得
    val item = parent.getItemAtPosition(position) as 
    MutableMap<String,String>
  } 
 }
}
```


###4 MutableMapのitemをそれぞれ取得

■MutapleMapの配列に入ったitemをそれぞれ取得して変数に入れる。
(遷移先で使う)

``` kotlin
private inner class ListItemClick: AdapterView.OnitemClickListener {
  override fun onItemClick(parent: AdapterView<*>, view:View,position: Int, id: Long){ 

    val item = parent.getItemAtPosition(position) as 
    MutableMap<String,String>

    //itemにはタップした行のMutableMap<string,string>の配列が入っている。
    val menuName = item["name"]
    val menuPrice = item["price"]
  } 
 }
}
```

###5 Intent 次の画面を起動する準備
■Intentクラスの生成 (画面遷移をするのに必要)

``` kotlin
Intent(packageContext: Context, cla: Class)
```
■第一引数 packageContext: Context
遷移元の画面

■第二引数 cla: Class
どの画面に遷移しますか？
起動するアクティビティ(画面)をJavaクラス化したものを渡さないといけない。
[クラス名::class.java]

``` kotlin
private inner class ListItemClick: AdapterView.OnitemClickListener {
  override fun onItemClick(parent: AdapterView<*>, view:View,position: Int, id: Long){ 

    val item = parent.getItemAtPosition(position) as 
    MutableMap<String,String>

    val menuName = item["name"]
    val menuPrice = item["price"]
    //新たに作ったアクティビティのNameを第2引数に書く
    val intent2Menu = Intent(this@MainActivity, MenuActivity::class.java)
  }
 }
}
```

###6　次の画面へ渡す値をインスタンスに入れる。
■putExtra("キー　",値)
Intentのインスタンスに遷移先の画面に渡す値を持たせる。

``` kotlin
private inner class ListItemClick: AdapterView.OnitemClickListener {
  override fun onItemClick(parent: AdapterView<*>, view:View,position: Int, id: Long){ 

    val item = parent.getItemAtPosition(position) as 
    MutableMap<String,String>

    val menuName = item["name"]
    val menuPrice = item["price"]

    val intent2Menu = Intent(this@MainActivity, MenuActivity::class.java)
    //キーはわかりやすくaとbにしてみました。
    intent2Menu.putExtra("a",menuName)
    intent2Menu.putExtra("b",menuPrice)
  }
 }
}
```


###7 次の画面を起動
■startActivity(Intentのインスタンス)
遷移したい画面を起動する。
遷移と言っているが次の画面が上に重なるイメージ

``` kotlin
private inner class ListItemClick: AdapterView.OnitemClickListener {
  override fun onItemClick(parent: AdapterView<*>, view:View,position: Int, id: Long){ 

    val item = parent.getItemAtPosition(position) as 
    MutableMap<String,String>

    val menuName = item["name"]
    val menuPrice = item["price"]

    val intent2Menu = Intent(this@MainActivity, MenuActivity::class.java)
    
    intent2Menu.putExtra("a",menuName)
    intent2Menu.putExtra("b",menuPrice)
    //次の画面を起動
    startActivity(intent2Menu)
  }
 }
}
```

#■遷移先の画面

■レイアウト

``` kotlin
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/tv_thx_title"
        android:textSize="25sp"
        android:gravity="center"
        android:layout_marginBottom="10dp"/>
    
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/tv_thx_desc"
        android:layout_marginBottom="10dp"
        android:textSize="15sp"/>
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        
        <TextView
            android:id="@+id/tvMenuName"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>

        <TextView
            android:id="@+id/tvMenuPrice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        
    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onBackButtonClick"
        android:text="@string/tv_thx_back"/>

</LinearLayout>
```

stlings.xmlの記述は省略します。

![スクリーンショット 2021-06-08 17.50.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/6220a6bb-5a4a-3d5b-e340-a533be5fc501.png)

###1 渡された値を取得
■intent.getStringExtra(渡された値のキー)

getStringは渡された値がStingの場合に使う
getなになには渡された値の型に合わせる。

``` kotlin
class MenuActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_menu)
        //キーを入れる。
        val menuName = intent.getStringExtra("a")
        val menuPrice = intent.getStringExtra("b")
    }
  }
```

###2 MenuActivityの使用するTextViewを取得

``` kotlin
class MenuActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_menu)
  
        val menuName = intent.getStringExtra("a")
        val menuPrice = intent.getStringExtra("b")
       //TextViewを取得
        val tvMenuName = findViewById<TextView>(R.id.tvMenuName)
        val tvMenuPrice = findViewById<TextView>(R.id.tvMenuPrice)
    }
  }
```

###3 TextViewに渡された値をtextで表示する。

``` kotlin
class MenuActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_menu)
  
        val menuName = intent.getStringExtra("a")
        val menuPrice = intent.getStringExtra("b")
  
        val tvMenuName = findViewById<TextView>(R.id.tvMenuName)
        val tvMenuPrice = findViewById<TextView>(R.id.tvMenuPrice)
        //渡された値をtextViewのtextに表示
        tvMenuName.text = menuName
        tvMenuPrice.text = menuPrice
    }
  }
```

###4 戻るボタンもついでにつける。


``` kotlin
class MenuActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_menu)
  
        val menuName = intent.getStringExtra("a")
        val menuPrice = intent.getStringExtra("b")
  
        val tvMenuName = findViewById<TextView>(R.id.tvMenuName)
        val tvMenuPrice = findViewById<TextView>(R.id.tvMenuPrice)
 
        tvMenuName.text = menuName
        tvMenuPrice.text = menuPrice
    }
  }
 //ButtonにOnClick要素を入れているのでfunで呼び出し
 fun onBackButton(view: View) {
  //これで画面を終了させる。そして前の画面が現れる。
   finish()
 }
```

これで完成です！

![Intent.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/27c7d673-a246-e1ad-305e-0d0821dc8eb7.gif)