У меня есть 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
Пожалуйста, любое предложение
Вы забыли создать()
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
Можете ли вы объяснить лучше или дать ссылку на ссылку, объясняющую причину, по которой не рекомендуется помещать ее в onBindViewHolder? Я нахожу много ссылок, делающих это, и я лично делаю это сам? заранее спасибо
@Shermano, я понятия не имею об этом, и мне нужно знать, почему не рекомендуется помещать его в onBindViewHolder?
Прости @JimaleAbdi, я просил @MiniChip\
Здесь github.com/googlesamples/android-sunflower/blob/master/app/src/… некоторые из примеров Google, и даже в своем руководстве они упомянули о выполнении любого прослушивателя кликов во внутреннем классе вместо onBind.
@Jimale Проверьте это тоже stackoverflow.com/questions/33845846/…
Ваш код работает Я проверил и воспроизвел код вашего адаптера, и он работает, пришлите мне ваш макет 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, пожалуйста, проверьте обновленный вопрос
@JimaleAbdi ваше приложение падает, когда вы нажимаете?
Да начинает давить
@JimaleAbdi я нашел решение. вы не можете отправить applicationContext, вы должны отправить контекст своей деятельности. Исправьте это val adapter = OperationAdapter(this, arrayList)Вы не можете создать диалог в классе приложения, так как диалог должен быть прикреплен к окну, приложение не является классом пользовательского интерфейса и не имеет окна, поэтому оно не может отображать диалог.
@JimaleAbdi и о никогда не помещайте свой щелчок в onBindViewHolder. Ваш метод называется «onBindViewHolder», и он должен связать ваш ViewHolder только с вашей моделью (элементом) и ничего более. Это делает ваш код чище и читабельнее, потому что вы соблюдаете первый принцип SRP (принцип единой ответственности). Неплохой пример
@JimaleAbdi вы все еще получаете сбой?
@JimaleAbdi, это то же самое. Попробуйте найти журнал о вашем исключении и пришлите мне
Спасибо, это работает, пожалуйста, обновите свой ответ, чтобы помочь другому, еще раз спасибо за помощь мне
Спасибо за ваше предложение, я попробовал ваше решение, но оно все равно не работает, проверьте обновленный вопрос, я удаляю onClick в onBindViewHolder, но это внутренний класс