Kotlin открывает AlertDialog в элементе RecycleView, щелкает

У меня есть RecyclerView, я хочу открыть AlertDialog при нажатии элемента RecyclerView, я пытаюсь следовать концепции Этот вопрос на основе Java, но у меня это не сработало

Мой адаптер

class OperationAdapter (val context: Context,private val arrayList: ArrayList <Operations>):
RecyclerView.Adapter <OperationAdapter.Holder> () {

companion object {
    val TAG: String = OperationAdapter::class.java.simpleName
}

override fun onCreateViewHolder (parent: ViewGroup, viewType: Int): Holder {
    return Holder (LayoutInflater.from (parent.context ).inflate (R.layout.operaitemlist , parent, false))
}

override fun getItemCount (): Int = arrayList. size

override fun onBindViewHolder (holder: Holder, position: Int) {

    val opera = arrayList[position]
    holder.setData(opera, position)

}

inner class Holder (itemView: View): RecyclerView.ViewHolder (itemView) {

    private var currentOpera: Operations? = null
    private var currentPosition: Int = 0


    init {

        itemView.cardview.setOnClickListener {
            currentOpera?.let {

                AlertDialog.Builder(context)
                    .setTitle("My Title")
                    .setMessage("My Message")
                    .create()
                    .show()

            }
        }

        //the end of the init
    }

    //getting data from Operations and bind it into View
    fun setData(operation: Operations?, position: Int) {
        operation?.let {
            itemView.txtphonenumber.text = operation.phone
            itemView.txttime.text = operation.etime
        }

        this.currentOpera = operation
        this.currentPosition = position
    }
}

Настройте повторное использование

//set up the recycleview
    mRecyclerView.setHasFixedSize (true)
    mRecyclerView. layoutManager = LinearLayoutManager(this)

          //adapter
          val adapter = OperationAdapter(applicationContext,arrayList)
                        adapter.notifyDataSetChanged()
                        mRecyclerView.adapter = adapter

Пожалуйста, любое предложение

0
0
1 845
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы забыли создать()

val alertDialog = AlertDialog.Builder(context)
        .setTitle("My title")
        .setCancelable(true)
        .setMessage("My message")
        .create()

        alertDialog.show()

Надеюсь, поможет

Во-первых, никогда не помещайте onclick в onBindViewHolder. Это не очень хорошая практика. Во-вторых, если вы хотите выполнить какое-либо событие щелчка по элементу, вы можете либо перейти к интерфейсу, либо поместить прослушиватель щелчка элемента в класс ViewHolder (внутренний класс), который расширяет RecyclerView.ViewHolder .

item.setOnClickListenr{
  AlertDialog.Builder(this)
            .setTitle("My Title")
            .setMessage("My Message"))
            .setPositiveButton("Yes") { dialog, which -> todoFunctiononpositiveclick() }
            .setNegativeButton("No") { dialog, which -> dialog.dismiss() }
            .show()
 }

Используйте эту ссылку для лучшего понимания взаимодействия с адаптером через интерфейс https://android.jlelse.eu/click-listener-for-recyclerview-adapter-2d17a6f6f6c9

Спасибо за ваше предложение, я попробовал ваше решение, но оно все равно не работает, проверьте обновленный вопрос, я удаляю onClick в onBindViewHolder, но это внутренний класс

Jimale Abdi 17.06.2019 22:53

Можете ли вы объяснить лучше или дать ссылку на ссылку, объясняющую причину, по которой не рекомендуется помещать ее в onBindViewHolder? Я нахожу много ссылок, делающих это, и я лично делаю это сам? заранее спасибо

Shermano 17.06.2019 23:35

@Shermano, я понятия не имею об этом, и мне нужно знать, почему не рекомендуется помещать его в onBindViewHolder?

Jimale Abdi 17.06.2019 23:55

Прости @JimaleAbdi, я просил @MiniChip\

Shermano 18.06.2019 01:03

Здесь github.com/googlesamples/android-sunflower/blob/master/app/s‌​rc/… некоторые из примеров Google, и даже в своем руководстве они упомянули о выполнении любого прослушивателя кликов во внутреннем классе вместо onBind.

Mini Chip 18.06.2019 08:24

@Jimale Проверьте это тоже stackoverflow.com/questions/33845846/…

Mini Chip 18.06.2019 08:32
Ответ принят как подходящий

Ваш код работает Я проверил и воспроизвел код вашего адаптера, и он работает, пришлите мне ваш макет xml и код инициализации этого адаптера

Обновить:

You can't send applicationContext, you should send context of your activity. Fix on that val adapter = OperationAdapter(this, arrayList) You can not create a dialog within an application class since, the Dialog should be attached to a window, an Application is not UI class and has no window, so it can't show the dialog.

Спасибо, я опубликую код xml, пожалуйста, проверьте обновленный вопрос

Jimale Abdi 17.06.2019 23:40

@JimaleAbdi ваше приложение падает, когда вы нажимаете?

manwtein 18.06.2019 00:03

Да начинает давить

Jimale Abdi 18.06.2019 00:06

@JimaleAbdi я нашел решение. вы не можете отправить applicationContext, вы должны отправить контекст своей деятельности. Исправьте это val adapter = OperationAdapter(this, arrayList)Вы не можете создать диалог в классе приложения, так как диалог должен быть прикреплен к окну, приложение не является классом пользовательского интерфейса и не имеет окна, поэтому оно не может отображать диалог.

manwtein 18.06.2019 00:08

@JimaleAbdi и о никогда не помещайте свой щелчок в onBindViewHolder. Ваш метод называется «onBindViewHolder», и он должен связать ваш ViewHolder только с вашей моделью (элементом) и ничего более. Это делает ваш код чище и читабельнее, потому что вы соблюдаете первый принцип SRP (принцип единой ответственности). Неплохой пример

manwtein 18.06.2019 00:19

@JimaleAbdi вы все еще получаете сбой?

manwtein 18.06.2019 00:20

@JimaleAbdi, это то же самое. Попробуйте найти журнал о вашем исключении и пришлите мне

manwtein 18.06.2019 00:23

Спасибо, это работает, пожалуйста, обновите свой ответ, чтобы помочь другому, еще раз спасибо за помощь мне

Jimale Abdi 18.06.2019 00:35

Другие вопросы по теме