【kotlin】ListView Toast

#■ListViewとは
Todoリストのようなレイアウトを作る時に使うもの。

▼entries
string.xml
string-arrayで追加しものを画面に表示する。

``` kotlin
//activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ivMenu"
    android:entries="@array/lv_menu"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

//中には何も書かなくてよい。

</ListView>
```
この時点でビルド
![スクリーンショット 2021-06-05 13.30.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/16b2aea5-aa01-6313-b0a2-85e0fb3e3211.png)

#■クリックした時のイベントを作る。

###1リスナクラスを作る。
AdapterViewにあるメンバーンターフェイスのOnItemClickListenerを用意
インターフェイスに用意されたメソッド
onItemClick()を定義

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

■onItemClick()の引数の理解

▼parent:AdapterView<*>
タップされたリスト全体を引数として渡す。

▼view:View
タップされた1行分の画面部品そのもの

▼position: Int
タップされた行番号を表す一番上から0番

▼is:long

これを踏まえた上で下記コードを追加

``` kotlin
//何番の文字型のデータを取得
val item = parent.getItemAtPosition(position) as String
```

▼parentはAdapterView型です。AdapterViewクラスにgetItemPosition()があります。
■getItemPosition()
引数に行番号を渡すとタップされた行のデータを取得します。

■as String
getItemPosition()の戻り値の型はAny型なので
リストデータに書いている型に変換する。キャスト

#■Toastメッセージをふんわり表示(一定の時間で消える。)

``` kotlin
Toast.makeText(引数1,引数2,引数3).show()
```

■引数1context: Context
文字をどこの画面に表示するかを指定する。
トーストを表示させるアクティビティオブジェクトを指定この事をContextと呼ぶ。
自身のクラスを指定する時thisを使う。

例：this@Main.Activity
thisのみで自身のインスタンスを指すがコンパイルエラーを避けるためthis@アクティビティ名にする。

■text: CharSequence
表示文字を指定します。

■引数3 duration: Int
文字が表示される長さを決める。
Toast.LENGTH_LONG 　長め
Toast.LENGTH_SHOT　 短め
この2種類しかないです。

``` kotlin
//例：完成版
val show = "こんにちわ"

//こんにちわって文字を長めにトーストして表示する。
Toast.make(this@MainActivity,show,Toast.LENGTH_LONG).show()
```

#■リスナを設定

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

        //ここから
        val lvMenu = findViewById<ListView>(R.id.ivMenu)
        lvMenu.onItemClickListener = ListItemClick()
    }

//リスナ
private inner class ListItemClick: AdapterView.OnItemClickListener {
   override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {}

val item = parent.getItemAtPosition(position) as String
val show = "これは" + item
//トースト
Toast.make(this@MainActivity,show,Toast.LENGTH_LONG).show()
}
```

#■プロパティのセッタか通常のメソッド

リスナ設定の方法がメソッドによって違う場合がある。

setOnItemClickListener()メソッドは、onItemClickListenerプロパティのセッタであるため、
onItemClickListenerプロパティに直接リスナを設定できる。

``` kotlin
  val lvMenu = findViewById<ListView>(R.id.ivMenu)
  lvMenu.onItemClickListener = ListItemClick()
```

setOnClickListener()メソッドは、onClickListenerプロパティのセッタではないため、
onClickListenerプロパティにリスナを直接代入することができない。

``` kotlin
  val btClick = findViewById<Button>(R.id.btClick)
  val listener = HelloListener()

  btClick.setOnClickListener(listener)
```

###■見分け方
基本この形で書く

``` kotlin
 lvMenu.setonItemClickListener(ListItemClick())
```
もしUse property access syntaxと出れば。
プロパティにリスナを直接代入できると言う合図

``` kotlin
lvMenu.onItemClickListener = ListItemClick()
```
このようになる。