open classを継承したdata classを複数作成し
それぞれのリストダイアログを制御してみました。
package com.example.samplelistdialog
open class MySpinnerItem(
var text: String
)
data class Fruit(
val id: Int,
val name: String,
val limit: String
) : MySpinnerItem(name)
data class MyColor(
val id: Int,
var name: String
) : MySpinnerItem(name)
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: List<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.text)
}
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")
}
}
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 fruit dialog
val listItems = mutableListOf<Fruit>()
listItems.add(Fruit(100, "apple", "2022-12-31"))
listItems.add(Fruit(200, "orange", "2023-01-31"))
listItems.add(Fruit(300, "grape", "2022-12-10"))
val fruitDialog = ListDialog(listItems)
// init color dialog
val colorList = mutableListOf<MyColor>()
colorList.add(MyColor(10, "white"))
colorList.add(MyColor(20, "black"))
colorList.add(MyColor(30, "red"))
val colorDialog = ListDialog(colorList)
binding.txvFruit.setOnClickListener {
fruitDialog.show(supportFragmentManager, "fruit")
}
binding.txvColor.setOnClickListener {
colorDialog.show(supportFragmentManager, "color")
}
}
override fun onSelectedItem(dialog: ListDialog, selectedItem: MySpinnerItem) {
when(dialog.tag) {
"fruit" -> {
val item = selectedItem as Fruit
val id = item.id
val name = item.name
val limit = item.limit
binding.txvFruit.text = "$id: $name\n$limit"
}
"color" -> {
val item = selectedItem as MyColor
val id = item.id
val name = item.name
binding.txvColor.text = "$id: $name"
}
}
}
}