ホーム
2022.10.1

kotlin リスト選択ダイアログを使う

DialogFragmentを継承したリスト選択ダイアログを作成し、
選択されたアイテムを任意のデータ型で取得する内容です。
IdとName属性を持つData Classで取得しています。

MySpinnerItem.kt

package com.example.samplelistdialog

data class MySpinnerItem(
val id: Int,
var name: String
)

ListDialog.kt

package com.example.samplelistdialog

import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.widget.ArrayAdapter
import androidx.fragment.app.DialogFragment
import java.lang.IllegalStateException

class ListDialog(private val list: MutableList<MySpinnerItem>): DialogFragment() {

interface Listener {
fun onSelectedItem(dialog: ListDialog, selectedItem: MySpinnerItem)
}
private lateinit var listener: Listener

override fun onAttach(context: Context) {
super.onAttach(context)
when {
parentFragment is Listener -> listener = parentFragment as Listener
context is Listener -> listener = context
}
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return activity?.let {
val builder = AlertDialog.Builder(it)
val items = arrayListOf<String>()
for (element in list) {
items.add(element.name)
}
val adapter = ArrayAdapter(it, android.R.layout.simple_list_item_1, items)
builder.setAdapter(adapter) { _, witch ->
listener.onSelectedItem(this, list[witch])
}
builder.create()
} ?: throw IllegalStateException("Activity cannot be null")
}
}

MainActivity.kt

package com.example.samplelistdialog

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.samplelistdialog.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity(), ListDialog.Listener {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

// init
val listItems = mutableListOf<MySpinnerItem>()
listItems.add(MySpinnerItem(100, "apple"))
listItems.add(MySpinnerItem(200, "orange"))
listItems.add(MySpinnerItem(300, "grape"))

val fruitDialog = ListDialog(listItems)

binding.txvSample.setOnClickListener {
fruitDialog.show(supportFragmentManager, "fruit")
}
}

override fun onSelectedItem(dialog: ListDialog, selectedItem: MySpinnerItem) {
when(dialog.tag) {
"fruit" -> {
val id = selectedItem.id
val name = selectedItem.name
val str = "$id: $name"
binding.txvSample.text = str
}
}
}
}
ホーム