【はじめてのKotlinプログラミング(18)】ListView(リストの表示)

kotlinで、リストを表示するやり方について解説します。

メモ帳とか、
ToDoアプリとか、
あとニュースアプリのように
何かしら一覧表示されているアプリには、このリスト表示の知識が使われるので
勉強しましょう、ということですね。

ちなみにリスト表示には、今回扱う「ListView」、
それからもう一つ「RecyclerView」ってのがあります。
RecyclerViewは、このListViewの進化版だと思っておいてOKなので
一応用語として、そういうのがあるんだなというのを覚えておいてください。

ということで、今回は、基礎的なリスト表示の「ListView」を使って
シンプルなリストアプリを作ってみましょう。

動画

コード

▼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

▼MainActivity.kt

package com.example.simplelistapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.Toast

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

        //2)Viewの取得&表示させるデータ(配列)を用意
        val lv:ListView =findViewById(R.id.lv)
        val data = arrayOf(
            "ライオン","クマ","キリン","ゾウ","パンダ","コアラ","キリン","サル","ヒョウ",
            "ゴリラ","カバ","カピバラ","リス","ワニ","ハムスター","ヒツジ","ネコ"
        )

        //3)アダプター
        val adapter=ArrayAdapter(
            this,
            android.R.layout.simple_list_item_1,
            data
        )

        //4)adapterをlistviewにセット
        lv.adapter =adapter

        //5)クリックしてトースト表示
        lv.setOnItemClickListener { adapterView, view, i, l->
            Toast.makeText(this,data[i],Toast.LENGTH_SHORT).show()
        }
    }
}

テキスト

で、実際の作業の前に、ざっくりとした概念を説明しておきます。
リスト表示は、見た目は1つの画面なんですが、
実際には複数の要素から成り立っています。

まあ主に3つの要素なんですが、

1つは表示させる画面。どこに表示させるんやと。
まあ、ここは今までのように
TextViewとか、ImageViewとかを設置してきたのと同様
リストを表示させるのでListViewってだけの話なので、そんなに問題ないと思います。


次にリストレイアウト。
1列なのか2列なのか、もっと複雑なやつなのか、っていう仕様も決めてあげる必要があります。
ちなみにリストレイアウトは自作することも当然できますが
androidスタジオ先生があらかじめ用意してくれているやつもあるので
今回はそれを使っていきます。

で、最後にデータですね。何を表示させるんやと。

てことで、データをこのレイアウトに入れて、
それを画面に表示させる、という複数の要素でなりたっています。


これらを1つにまとめるときには「アダプター」という用語が出てきます。
要は、文字通りアダプターなんですけども

これを差し込んで、これを差し込んで、これを差し込んで
1つにまとめてから⇒表示と。
こういう仕組みになっています。

なので、部品さえ用意できれば表示できるという話ではなくって
まずはそれぞれの要素を作って
アダプターにまとめてから表示、という仕組みになっていますので
この概念図をなんとなく頭に入れておいてください。


それでは、ふんわりとイメージがつかめたところで始めていきましょう。

 

1)ListView(xml)

それでは始めていきましょう。
AndroidStudioを起動します。

クリエイトnew project⇒Empty Activity

名前は適当に
SimpleListApp
とかにしておきます。でfinish

はい、これでプロジェクトが起動できました。
まずはxmlで画面をつくっていきましょう。
先ほどの図でいうところのコレですね。

といってもここは簡単で、listViewっていうのを入れるだけなので

あ、TextViewは要らないのでカット。

でlistViewを追加するには
パレットの検索からlistといれると
ListViewって出てくるのでこれを、ズルズル~っと持っていってください。

で、制約を付けてあげるんですが
ここはもう、単純に親要素一杯でいいと思いますので
幅も高さもmatch_parentにしてあげましょう。
mって入れると出てくると思います。

これで画面いっぱいになりました。

あとはidだけ決めてあげれば終了です。
listView、略してlvこれで1つめが終わりました。

ちなみにエミュレータを起動して、一応画面を確認してみますか。
まあ、今は何もないわけですが、逆にいうと、まだ何もないことを確認しましょう。

こうですね、コードだけ書いても今はまだ何も表示はされていません。


で、今画面が終わって、次。
2つ目のListレイアウトなんですが、今回ははandroidであらかじめ用意されているものを使うので
いったん飛ばして、
表示させるデータを用意していきましょう。

 

 

2)データを用意(配列)

それではxmlはこれで完成なので
プログラミングをやっていきましょう。
MainActivity.ktを開いてください。

で、先ほど作ったViewを取得して
配列を用意していきます。

//2)Viewの取得&表示させるデータ(配列)を用意

今回、main.xmlの作業を1番目としておくので
その続きということで通し番号も「2」としておきます。

でまずは listView を取得して

データを用意します。
で、データはもう、横着をしてこちらにサンプルを用意しましたので
概要欄のリンクからコピペしてご利用ください

一応説明だけしておきますと、
変数名を、そのままですがdataとして、
arrayOfで、動物の名前を適当にいくつか入れておきました。


ここは別に、食べ物の名前でもいいですし、都道府県とか、
歴史上の人物とか、お好みに応じて、色々作っていただいて結構です。

個数は、4つ5つでもよかったんですが
一応、画面からはみ出るくらいにしたかったので、ちょっと多めに作っています。

 

実はもうこれでですね、
先ほどの図でいうところの

●画面が出来て
●リストレイアウトはAndroidのありものを使うのでOKで
●データも用意できた
ということで、三種の神器が揃いました。

それでは今回の本丸、アダプターに差し込んでいきましょう。

 

3)adapter
4)ListViewにセット

それではアダプターを書いていきましょう。

//3)アダプター


まずは変数を用意してあげて

val adapter

で、アダプターにも色々あるんですが
今回はArrayAdapter()を選択してください
そうするとインポートされて使えるようになります。

この中に、先ほどの3つを書いていきます。
まず画面ですが、この画面というか、自分自身という意味でthis
次にレイアウトですが
android.R.layout.simple_list_item_1,

1っていうのがあるってことは2っていうのもあって、
1が1行ごとになってて
2の方が、上段下段と2行ごとのリストが作れます。
名前と住所がセットになってる時とかですね。

今回は動物の名前を表示するだけなので、1行ごとのlist_item_1の方でいきます。

で、最後に、入れるデータは、こちらのdata
これで、adapterの中に、これら3つが入りました。

あとは表示してあげればいいので
listViewにセットします。

//4)adapterをlistviewにセット
listView.adapter = adapter

これでエミュレータを起動して、リストが表示されているか確認してみましょう。

—————————————-

はい、こんな感じで無事、リストが表示されているのがわかります。

ただし、今は、リストが表示されただけでクリックしても
何も起きません。

なので最後に、クリックした場所を特定して、トーストで表示してみましょう。

 

5)タッチしたアイテムを表示

それでは、リストがクリックされたアイテムを取得して、トーストで表示してみましょう。

//5)クリックしてトースト表示


アイテムがクリックされた時の処理というのは、
setOnItemClickListener というのを使います。

listView.setOnItemClickListener{

アイテムをクリックしたときに、反応しますよと。
Listenerっていうのは、「聞く」って訳すと意味が通じにくいので
音がした時、反応しますよね。反応って意味に近いです。
アイテムをクリックしたときに、反応しますよと。

今まではsetOnClickListenerを使ってましたけど、
itemと入っているので間違えないようにしてください。


で、解説はあとにして、引数をですね、4つ、
画面に言われるままに選択していってください。

adapterView, view, i, l ->


で、この->マークに続けて、トーストを書いていきます。
が、今のこれ、何やねん、っていうのを簡単に説明しておきます。

実はですね、少し前まではこのような表記になっていました。
parent, view, int position, long id

意味を理解する点では、これらを見てもらった方がわかりやすいかもしれません。
adapterView、あるいはparent。
parentと言えば察しがつくかと思いますが、タップされたListViewの「画面全体」のことですね。

で、viewっていうのは、もう少し限定して、タップした1行分の画面

iっていうのは、positionって見ると理解しやすいと思いますが、タッチされた行番号ですね。
たとえば今回でいうと「ライオン」をタッチしたらは0行目、クマをタッチしたら1行目、
という数字が取得されます。

で、最後のlっていうのはDBのデータの値なので、今回は割愛。

ていうのをふんわりと理解しておいてください。

それではToastのを書いていきます。

lv.setOnItemClickListener { adapterView, view, i, l ->
Toast.makeText(this,
}

で、ここに表示したい文言を記述するわけですが、
たっちした配列の、何番目かを表示させたいので
dataの配列の、押された番号、ということで、int positionのiをこの中に入れてあげます。

あとは長さを決めて、今回は短い方のToast.LENGTH_SHORT

で、最後に.show()

lv.setOnItemClickListener { adapterView, view, i, l ->
Toast.makeText(this,data[i],Toast.LENGTH_SHORT).show()
}


これで、エミュレータを起動して、確認してみましょう。

———————————-
はい、こうですね。
おされた配列の名前が表示されているのがわかります。

今、何をやったか理解できないという場合はですね、
ちょっとこうやってみましょうか。
dataをやめて

i.toString()

そうすると、今度は、押された数字が表示されるはずなので、
本当にそうなっているか確認してみましょう。

はい、こうですね。
おされたポジションの数字が表示されているのがわかります。

てことで、配列の番号が取得できているので
先ほどの話に戻りますが、dataの配列のi番目、と書いてあげることで
この中の、押されが番号が表示されるようになった、ということになります。

以上、今回は、簡単なリストアプリの作り方解説でした。

 

おまけ:Parameter’parent’is never used, could be renamed to_

小さいwarnningが3つほど出ていると思いますので、それの説明と対処法を説明します。

右うえの方に、薄い忠告が3つほど出ています。
クリックしてみると

Parameter’parent’is never used, could be renamed to_


32行目、adapterViewっていうのを使っていませんよと。
で、使わないんだったらrenamed to _ 、
つまり「_」に書き換えたらええやで、ってことなので、
_にしてみましょう。

はい、そうすると、1つ忠告が消えました。

同じようにViewも使わないんだったら renamede to _ということなので
_にしてみます。
はい、これで消えました。

同じく最後も_で、全て消えました。

以上、リネームの解説でした。

 

コメントを残す