Table of Contents
以前 Kotlin による基本的な ListView の作成方法について紹介しました。
今回は上記の記事で作成した ListView の項目をタップした際のイベント処理について紹介します。また、リスト項目を挿入・削除する方法についても解説します。
サンプルアプリの動作
以下の動作を行う ListView を表示するアプリを例に、タッチイベントの設定方法を解説します。
- リストの最後の項目「+」をクリックすると、その上に新しいリスト項目を追加する
- リストの最後以外の項目を長押しすると、その項目を削除する
アプリを起動すると、以下のようなリストが表示されます。
一番下の項目「+」をタップすると、新しいリスト項目がその上に追加されます。
「+」以外の項目を長押しすると、その項目を削除することができます。以下は「Android」を削除した後のリストです。
サンプルアプリのプログラム
レイアウトXMLで画面に ListView を配置し、そのリストにプログラム(Kotlin)で項目とクリックしたときの処理を設定します。
activity_main.xml
レイアウトを設定するXMLの中身は以下の通りです。前回のものと全く同じです。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.test.MainActivity" > <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
MainActivity.kt
Kotlin のプログラムです。リストの最後に「+」というテキストの項目と、タップした時と長押ししたときの処理を追加しています。
package com.example.test import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.widget.ArrayAdapter import android.widget.ListView import android.widget.TextView class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val arrayAdapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1).apply { add("Android") add("iOS") add("Windows") add("macOS") add("Unix") add("+") // 追加 } val listView : ListView = findViewById(R.id.listView) listView.adapter = arrayAdapter // 項目をタップしたときの処理 listView.setOnItemClickListener {parent, view, position, id -> // 項目の TextView を取得 val itemTextView : TextView = view.findViewById(android.R.id.text1) // 項目のラベルテキストをログに表示 Log.i("debug", itemTextView.text.toString()) // 一番下の項目をタップしたら新しい項目をその項目の上に追加 if (position == arrayAdapter.count - 1) { arrayAdapter.insert("New Item " + arrayAdapter.count, arrayAdapter.count - 1) arrayAdapter.notifyDataSetChanged() } } // 項目を長押ししたときの処理 listView.setOnItemLongClickListener { parent, view, position, id -> // 一番下の項目以外は長押しで削除 if (position == arrayAdapter.count - 1) { return@setOnItemLongClickListener false } arrayAdapter.remove(arrayAdapter.getItem(position)) arrayAdapter.notifyDataSetChanged() return@setOnItemLongClickListener true } } }
リスト項目のクリックを処理するには setOnItemClickListener を使用します。
listView.setOnItemClickListener {parent, view, position, id -> { // リスト項目をタップしたときの処理 }
同じように、長押しを処理する場合は setOnItemLongClickListener を使用します。
setOnItemLongClickListener が setOnItemClickListener と違う点は、イベントが正しく処理されたか(別の View にイベントを伝播させるか)を Boolean で返すところです。
listView.setOnItemLongClickListener {parent, view, position, id -> { // リスト項目を長押ししたときの処理 return@setOnItemLongClickListener true }
どちらも第3引数の position には、リスト項目の番号が格納されています。一番上の項目の番号が 0 です。
今回はこの値を利用して、項目の最後の要素であるかどうか、つまり position の値が (要素数 – 1) と等しいかどうかを調べて処理の分岐を行っています。
リストのテキストを取得
リスト項目のテキストを表示している TextView には android.R.id.text1 というIDが設定されていますので、これで項目のテキストを得ることができます。
val itemTextView : TextView = view.findViewById(android.R.id.text1) Log.i("debug", itemTextView.text.toString())
リスト項目の挿入・削除
ArrayAdapter のメソッド insert で項目の追加、remove で項目の削除ができます。
insert の第2引数には、項目を挿入する位置を指定します。
arrayAdapter.insert(項目のテキスト, 挿入位置)
remove は、削除する番号ではなく、削除する項目の要素(今回はテキストなのでString)を引数に指定します。
arrayAdapter.remove(削除対象の要素)
ArrayAdapter の getItem を使用して、その番号の要素を得ることができます。
これらのメソッドで項目を変更したら notifyDataSetChanged によって変更を同期させます。
おしまい
以上が ListView におけるタップや長押しのイベント処理と、項目の挿入や削除の方法です。
これらを組み合わせることで、項目を動的に変更できるリストが作れます。
ピンバック: [Kotlin] ListViewでAndroidアプリにリストメニューを表示 - JoyPlotドキュメント
ピンバック: [Kotlin] ListViewの項目にボタン付きの自作レイアウトを設定 - JoyPlotドキュメント