[Kotlin] グリッドビューを表示してクリックを処理する

私の著書のAndroid SDKポケットリファレンスでまだ対応できていないKotlin化ですが、業務でも利用される機会が多くなってきているかと思います。
少しでもお役に立てるように、Kotlin化した場合にどのように書いていくのかを紹介していくコーナー。
今回はグリッドビュー (GridView) を紹介します。

グリッドビューもリストビューと同じくレガシー扱いとなりましたので、参考程度にどうぞ。

今回のサンプルコードは以下に公開しています。

グリッドビューの表示

まずはレイアウトの表示からです。
以下のようにレイアウトを定義します。

activity_main.xml

    <GridView
        android:id="@+id/grid_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:numColumns="2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

GridViewのタグを利用します。ここでは、画面全体となるように設定を行っています。
そして、android:numColumnsでカラムをいくつに分割するかを指定します。
何も指定しない場合は1列となるため、リストビューのような表示となります。今回は2を指定してみました。

表示するデータの設定

表示するデータはコード上で設定しましょう。

MainActivity.kt

        // グリッドビューに表示するテキスト一覧
        val countries = arrayOf("日本", "中国", "イギリス", "アメリカ", "オランダ", "オーストラリア",
            "スイス", "ドイツ", "メキシコ", "スウェーデン", "アイルランド", "フランス", "イタリア")
        val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, countries)
        val gridView: GridView = findViewById(R.id.grid_view)
        gridView.adapter = adapter

arrayOf()で文字列のリストを作成し、ArrayAdapterに渡してアダプターのオブジェクトを生成します。
そして、グリッドビューにバインディングするという流れです。
アダプターのレイアウトは1列で文字列が表示されれば良いので、android.R.layout.simple_list_item_1というOS側で定義されているレイアウトを利用しています。

クリック時の処理を実装する

最後にクリック時の処理も実装しましょう。

MainActivity.kt

        gridView.setOnItemClickListener { adapterView, _, position, _ ->
            Toast.makeText(this, "${adapterView.getItemAtPosition(position)} が選択されました",
                Toast.LENGTH_SHORT).show()
        }

グリッドビューのクリックをコールバックで受け取るには、setOnItemClickListenerの実装が必要です。
ラムダ式を用いて実装を行いましょう。
ここでは、getItemAtPosition()を用いてクリックされた位置のアイテムを取得し、その文字列をString Templeteを使って”xxxxx が選択されました”という形式でトースト表示しています。

実行結果

今回の実行結果は以下のとおりです。

これから実装するのであればRecyclerViewを用いていくのがベストだと思います。
近々の投稿でRecyclerViewの実装方法を紹介しますので、そちらを参考にしてください。
お楽しみに。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください