JavaでAndroid Studioアプリ開発を試みるの第6回 「ListView」

Android Studioのボタンの操作ができました。
その中で出てきたListViewとAdapterについて復習します。

まずはアクティビティの設定

activity_main.xmlでListViewというアイテムを追加。
android:id=”@+id/lvOutput”
そして、IDを設定します。
ここでは、lvOutputという名前にしました。
これを後で使います。

res -> layout -> 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/lvOutput"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:entries="@array/output_list"
        app:layout_constraintTop_toBottomOf="@+id/confirmButton"
        app:layout_constraintBottom_toBottomOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

 

ArrayListの使い方

重複しますが、実際の使い方をおさらい。
まずは、下記の行です。

List<String> outputList = new ArrayList<>();

List<String>というのは、文字列型のリストだよってことです。
その名前がoutputList
これは自分がつけたい名前を設定します。

で、最後にnew ArrayList<>()という記載。
これはArrayListという要素数が可変にできるリスト。
とっても便利です。

追加や削除は遅くて、データの読み出しが早いそうです。
List型の方が扱いやすいので上記のように書いているのですが、もちろん下記の同じ型指定でも書けます。
Listにしても問題ないのは、ArrayListがListを実装(imprements)したクラスだからです。(ArrayListの一部の機能は使えないのですが)

ArrayList<String> list = new ArrayList<>();

ざっくりとしたArrayListの使い方
下記のaddで要素を追加できます。
list.add(“A”);
list.add(“B”);
list.add(“C”);

getでデータを取り出せます。プログラミングの世界では数値は1からではなく0から始まります。
String s = list.get(0);

removeでリストから削除できます。下記の1の場合は2番目のBが消えます。
list.remove(1);

addでは、指定の箇所に挿入もできます。下記の場合はリストの1番目と2番目の要素の間に差し込みます。
list.add(1, “A’”);

setで、指定の項目を値入れ替えできます。{“A”, “B”, “C”}こういうリストだった場合にはBがZに置き換わります。
list.set(1, “Z”);

java -> com.aoi345.btnsample -> Main_Activity
public class MainActivity extends AppCompatActivity {

    List<String> outputList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    //ボタンクリック時のリスナクラス
    private class confirmBtnLister implements View.OnClickListener {

        @Override
        public void onClick(View view) {

            //部品の情報を取得
            EditText input_text = findViewById(R.id.inputText);
            //リストにデータを登録(入力された文字列を登録)
            outputList.add(input_text.getText().toString());

            //アダプターの生成
            ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, outputList);

            //アダプタの設定
            ListView lvOutput = findViewById(R.id.outputList);

            //アダプタの設定
            lvOutput.setAdapter(adapter);
        }
    }

 

画面の部品の話に少し話を戻す

その次がコレ。(前回から説明の順番を変えています。)

outputList.add(input_text.getText().toString());

早速addコマンドを使っています。
そして、add(***)の中身は文字列です。

input_text.getText().toString()ですが、input_textはEditTextで、その中身を取ってくるのがgetText()
そして、そのあとで.toString()を追加することで、戻される型を指定できます。
2回目だからちょっと詳しく説明してみました。
次が、一番の本題のアダプター

ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, outputList);

ArrayAdapterは、先ほどのArrayListのデータをListViewで表示するための接続部分です。
データ部分(ArrayList) – アダプター – 表示部分(ListView)という感じです。

上記では、adapterという名前でアダプターを生成しています。
new ArrayAdapter<>の部分はJavaの定番の書き方。
Javaでオブジェクトを生成する際にはこの書き方をします。

ポイントはArrayAdapterを生成する際の引数
①MainActivity.this, ②android.R.layout.simple_list_item_1, ③outputListと3つの引数を持っています。

このクラスのオブジェクトを作る処理の事をコンストラクタと言ったりします。
さらに、今回の引数の①MainActivity.thisはコンテキストと言ったります。

なんか似ていていややこしい。。
コンテキストの方は、腑に落ちる説明が難しい。。
調べると抽象クラスのインターフェースだとか、もう意味不明な説明が出てくる。
日本語にすると「文脈」だとか。。

使われ方によって違うのですが、ここで理解すべきはMainActivity.thisというコンテキストです。
このArrayAdapterで接続するListViewって誰がその情報を持ってます?ってことですね。
今回のArrayAdaputerが接続したいListViewはListViewはactivity_main.xmlで記載した。
その中には下記の記載があります。

tools:context=”.MainActivity”

コンテキスト・・・ですね。
まぁ、MainActivityというクラスがコードの部分は紐づいてますよってことです。
だから、今回のArrayAdapterはこのコンテキスト(MainActivity)を指定します。

さて、残る課題は.this
もう、意味不明な謎用語が出てきすぎです。。

コンテキストとしてMainActivityだけを設定するとどうなるか?ですが、まだ、実体化されていないので使えないよってことになります。
List<String> outputList = new ArrayList<>();という場合でも、List<String>だけでは何もできず、outputListという実体を生成して初めて色々できるようになります。

MainActivity.thisのthisですが、「MainActivity自身を実体化したもの」です。
外部からMainActivityの情報を利用したい場合に実体が必要なので、.thisが必要になります。

2つめの引数。
android.R.layout.simple_list_item_1
これですが、ListViewというリストの各項目をどんなレイアウトで表示しますか?という指定です。
自分で作ったレイアウトも指定できますが、Android Studioではある程度は用意されているので、それを使っているのが上記です。
上記の場合は、リストの1項目に1行のテキストを1つ表示してくださいというものになります。
ArrayListの場合は、単純なリストなので、これで良いでしょう。(“リンゴ”,”みかん”,”すいか”みたいなリスト)

1つの項目に対して2つの要素を表示したい場合には、android.R.layout.simple_list_item_2というものもあります。
こちらはリストの1項目にテキストを2つ表示してくださいというものになります。
(“リンゴ” “3つ”,”みかん” “1つ”,”すいか” “2つ”みたいなリスト)

そして、3つめは表示したい要素を詰め込んだArrayListです。

さて残りが、下記の2つ。これで、リスト化されたデータを一覧表示できます。

//アダプタの設定
ListView lvOutput = findViewById(R.id.outputList);
//アダプタの設定
lvOutput.setAdapter(adapter);

まぁこれらのfindViewByIdやsetAdapterは、前回の記事から追記することが無いので、今回は割愛します。

まとめ

前回もちょっと触れたのですが、ListViewをおさらいしました。
実際には、データベースを使うので、ArrayListではなく情報ソースはデータベース。
アダプターに関しても、ArrayAdapterではなくSimpleCursorAdapterというものを使います。
さらにCursorというものの知識も必要です。
まぁ、そこら辺はデータベースについて説明するときにでも書くとしましょう。

 

JavaでAndroid Studioアプリ開発を試みるの第5回 「ボタン関連②」
https://aoi345.com/memorandum/android-studio-button-2/

JavaでAndroid Studioアプリ開発を試みるの第5回 「ボタン関連②」