3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Kotlin研修2日目】Adapterを用いた可変リストデータのリストへの紐付けとダイアログ表示

Last updated at Posted at 2021-06-03

Adapterクラス

アクティビティで記述したリストデータをリスト形式ビュー(ListView/Spinner)に紐づけるクラス。
リスト形式ビューに反映するリストデータを管理し、リスト形式ビューの各Itemに当てはめる役割を担う。

主なAdapterクラス

クラス リストデータ型
ArrayAdapter Array/MutableList
SimpleAdapter MutableList<MutableMap<String, *>>
XML/JSONデータの解析結果を格納
SimpleCursorAdaptor Cursorオブジェクト
Android端末内DBに対するSELECT文の結果を格納

可変リストデータとListViewの紐づけ

可変のリストデータをListViewに紐づける手順は以下の通り。

  1. 可変のリストデータを用意
  2. リストデータを基にAdapterオブジェクトを生成
  3. ListViewadapterプロパティに、2.で生成したAdapterオブジェクトを代入

また、可変のリストデータをリスト形式ビューに反映する場合は、
XMLstrings.xmlに記述せず、Kotlin.ktファイルに記述する必要がある。

リストデータをもつArrayAdapterオブジェクトの生成

定義

参考: ArrayAdapter

ArrayAdapter(context: Context, resource: Int, objects: Array<T>)
// パラメータ
// context: コンテキストとなるアクティビティオブジェクト
// resource: リスト形式ビューの各Itemのレイアウトを表現するR値
// objects: リスト形式ビューに反映するリストデータ

サンプルコード

MainActivity.kt
// リストデータの定義
val menuList = mutableListOf("item1", "item2", "item3", ...)

// 定義したリストデータをもつAdapterオブジェクトを生成
val adapter = ArrayAdapter(
    this@MainActivity,
    android.R.layout.simple_list_item_1,
    menuList
)

R値

resフォルダ内のファイルや、ファイル中に記述されたリソースを識別するためのRクラス定数
Javaint型定数によって表現される。

android.R

Android SDKで用意されたリソースを識別するクラス。

android.Rクラスをインポート文で宣言すると、同名であるアプリ内のRクラスが読み込まれなくなるため、
android.RクラスのR値を利用する際はインポートせず、android.R.<R値>のように記述する。

ListViewに対するArrayAdapterオブジェクトのセット

ListViewadapterプロパティに、生成したArrayAdapterオブジェクトを代入する。

サンプルコード

MainActivity.kt
// Adapterがリストデータを紐づけるオブジェクト(=ListView)の定義
val lvMenu = findViewById<ListView>(R.id.lvMenu)

// ListViewにAdapterオブジェクトをセット(adapterプロパティにAdapterオブジェクトを代入)
lvMenu.adapter = adapter

ダイアログ(Dialog)

参考: ダイアログ
ユーザに対して処理続行の確認注意喚起追加情報の入力を求めるポップアップウィンドウ
AlertDialogクラスによって定義される。

ダイアログの画面構成

ダイアログ.png

ダイアログの最小構成

ダイアログを構成するための最小限の部品は以下の2つ。

  • コンテンツエリア
  • アクションボタン x1(Positive Button)

ダイアログの生成

ダイアログ生成クラスの作成

java/<PackageName>配下にKotlin Class/Fileを作成し、作成した.ktファイルに記述する。

ダイアログは汎用性が高いため、privateなメンバクラスでなくトップレベルクラスで宣言する。

java/com.example.listview2/OrderConfirmDialogFragment.kt
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.DialogFragment

// ダイアログを生成するクラス(DialogFragment()を継承)
class OrderConfirmDialogFragment: DialogFragment() {

    // ダイアログの生成処理
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

Android X

Androidアプリ開発で利用するSDKサポートライブラリ(=機能拡張を目的に追加されたクラス群)を、Google社がまとめたライブラリ
なお、Android Studioは、Android Xライブラリを標準で利用している。

API 28以降は基本的にAndroid Xライブラリを継承元にする。

ビルダーの生成

参考: AlartDialog.Builder

定義

AlartDialog.Builder(context: Context!)
// パラメータ
// context: ダイアログを表示するアクティビティオブジェクト(=コンテキスト)

サンプルコード

java/com.example.listview2/OrderConfirmDialogFragment.kt
// ダイアログを生成するクラス(DialogFragment()を継承)
class OrderConfirmDialogFragment: DialogFragment() {

    // ダイアログの生成処理
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

        // Dialogオブジェクトの定義
        // activity: OrderConfirmDialogFragment()オブジェクトを呼び出すNullableなアクティビティ
        // ?: セーフコール演算子(nullでない場合に代入する値を"?.let {...}"のブロック{}末尾に記述)
        // <- ※ブロック{}内では、nullチェック対象は"it"で置換される
        //    また、nullチェック対象がnullである場合は代入されない
        val dialog = activity?.let {

            // AlertDialog.Builderオブジェクトの生成
            // AlertDialog.Builder(context: Context!)
            // context: ダイアログを表示するアクティビティオブジェクト(=コンテキスト)
            // it: let関数ブロック内における、nullチェック対象(=activity)の変数
            val builder = AlertDialog.Builder(it)
            ...
        }
        ...
    }
}

ビルダー(Builder)

複数のプロパティをもつクラスのオブジェクトを、プロパティをコンストラクタで指定せずに生成するデザインパターン

ダイアログの表示設定

タイトル

// R値を指定して定義する場合
AlartDialog.Builder(Context!).setTitle(titleId: Int)
// 文字列を指定して定義する場合
AlartDialog.Builder(Context!).setTitle(title: CharSequence!)

コンテンツ

// R値を指定して定義する場合
AlartDialog.Builder(Context!).setMessage(messageId: Int)
// 文字列を指定して定義する場合
AlartDialog.Builder(Context!).setMessage(message: CharSequence!)

アクションボタン

// Positive Button
// R値を指定して定義する場合
AlartDialog.Builder(Context!).setPositiveButton(
    textId: Int,
    listener: DialogInterface.OnClickListener!
)
// 文字列を指定して定義する場合
AlartDialog.Builder(Context!).setPositiveButton(
    text: CharSequence!,
    listener: DialogInterface.OnClickListener!
)

// Negative Button(Positive Button同様、文字列の指定も可能)
// R値を指定して定義する場合
AlartDialog.Builder(Context!).setNegativeButton(
    textId: Int,
    listener: DialogInterface.OnClickListener!
)

// Neutral Button(同上)
// R値を指定して定義する場合
AlartDialog.Builder(Context!).setNeutralButton(
    textId: Int,
    listener: DialogInterface.OnClickListener!
)

// パラメータ
// textId, text: ボタンに表示する文字列
// listener: "タップ"イベントを検知するリスナクラスのインスタンス

サンプルコード

java/com.example.listview2/OrderConfirmDialogFragment.kt
// R値を指定してダイアログのタイトルを定義
builder.setTitle(R.string.dialog_title)
// R値を指定してダイアログのコンテンツを定義
builder.setMessage(R.string.dialog_msg)

// R値を指定してダイアログのアクションボタンを定義
// Positive Button
builder.setPositiveButton(
    R.string.dialog_btn_ok,
    DialogButtonClickListener()
)
// Negative Button
builder.setNegativeButton(
    R.string.dialog_btn_ng,
    DialogButtonClickListener()
)
// Neutral Button
builder.setNeutralButton(
    R.string.dialog_btn_nu,
    DialogButtonClickListener()
)

ダイアログオブジェクトの生成

サンプルコード

java/com.example.listview2/OrderConfirmDialogFragment.kt
class OrderConfirmDialogFragment: DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = activity?.let {
            val builder = AlertDialog.Builder(it)
            ...
            // Dialogオブジェクトの生成
            // -> 返却型はAlertDialog型
            builder.create()
        }

        // 生成したDialogオブジェクトを返却
        // ?:: エルビス演算子(nullである場合の処理を":"以降に記述)
        // <- let関数ブロック{}はactivityがnullでない場合の処理であり、
        //    activityがnullである場合はdialogもnullになる
        return dialog ?: throw IllegalStateException("Activity is null.")
    }
}

ダイアログ(Dialog)のリスナクラスの定義

参考: DialogInterface

サンプルコード

java/com.example.listview2/OrderConfirmDialogFragment.kt
class OrderConfirmDialogFragment: DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        ...
    }

    // DialogのAction Buttonの"タップ"イベントを検知するリスナクラス(リスナ)
    // DialogInterface: 各イベントのリスナインタフェースを子にするインタフェース
    // OnClickListener: "タップ"イベントを検知するメンバインタフェース
    private inner class DialogButtonClickListener: DialogInterface.OnClickListener {

        // "タップ"イベント検知時の処理(イベントハンドラ)
        override fun onClick(dialog: DialogInterface?, which: Int) {
            ...
        }
    }
}

アクションボタンに応じたイベントハンドラ

定義

DialogInterface?.OnClickListener.onClick(
    dialog: DialogInterface!,
    which: Int
): Unit
// パラメータ
// dialog: "タップ"を受け取るダイアログ
// which: "タップ"されるボタン
アクションボタン(=DialogInterface)の定数値
ボタン 定数
Positive DialogInterface.BUTTON_POSITIVE
値: -1
Negative DialogInterface.BUTTON_NEGATIVE
値: -2
Neutral DialogInterface.BUTTON_NEUTRAL
値: -3

サンプルコード

java/com.example.listview2/OrderConfirmDialogFragment.kt
override fun onClick(dialog: DialogInterface?, which: Int) {
    // "タップ"されたボタンに応じた分岐処理
    when(which) {
        // Positive Button
        DialogInterface.BUTTON_POSITIVE ->
            ...
        // Negative Button
        DialogInterface.BUTTON_NEGATIVE ->
            ...
        // Neutral Button
        DialogInterface.BUTTON_NEUTRAL ->
            ...
    }
    ...
}

ダイアログの表示

定義

MainActivity.kt
open fun show(
    @NonNull manager: FragmentManager,
    @Nullable tag: String?
): Unit
// パラメータ
// manager: FragmentManagerオブジェクト(=supportFragmentManagerプロパティ)
// tag: ダイアログを識別するための文字列タグ(任意)

サンプルコード

MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
    }
    ...
    // ListViewのItemの"タップ"イベントを検知するリスナクラス(リスナ)
    private inner class ListItemClickListener: AdapterView.OnItemClickListener {

        // "タップ"イベント検知時の処理(イベントハンドラ)
        override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
            // ダイアログ生成クラスのインスタンス化(実体化)
            val dialogFragment = OrderConfirmDialogFragment()

            // 生成したダイアログの表示
            dialogFragment.show(supportFragmentManager, "OrderConfirmDialogFragment")
        }
    }
}
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?