Я пытаюсь показать всплывающее меню для элементов в моем RecyclerView:
Все примеры кода о том, как это сделать, которые я нашел в Интернете, либо используют Java или когда они в редких случаях используют Kotlin, это делается без привязки данных.
В любом случае я пытаюсь добиться этого:
<ImageButton
android:id="@+id/options"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="14dp"
android:layout_marginEnd="16dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/desc_options"
android:onClickListener="@{(v) -> holder.test1.invoke()}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_more_vert" />
И в моем RowHolder I иметь следующий код:
class AgendaRowHolder(
private val binding: AgendaRowBinding,
val onRowClick: (AgendaModel) -> Unit
) : RecyclerView.ViewHolder(binding.root) {
fun bind(model: AgendaModel) {
binding.model = model
binding.holder = this
binding.executePendingBindings()
}
fun test1() {
// do something here
}
}
Однако это не будет компилироваться вообще, и обходной путь для решения этой проблемы состоит в том, чтобы иметь функцию как свойство класса AgendaRowHolder
, но этот подход не работает так как я также должен передать ImageView
для всплывающего меню, чтобы знать, где появиться. Поэтому я использовал этот альтернативный подход, а именно добавление onClickListener
в функцию bind()
:
fun bind(model: AgendaModel) {
binding.model = model
binding.holder = this
binding.executePendingBindings()
binding.options.setOnClickListener { showPopup(it) }
}
private fun showPopup(view : View) {
val popup = PopupMenu(view.context, view)
popup.setOnMenuItemClickListener { item ->
when (item.itemId) {
R.id.delete -> {
AgendaRepository.delete(binding.model!!)
true
} else -> false
}
}
val inflater: MenuInflater = popup.menuInflater
inflater.inflate(R.menu.actions_agenda, popup.menu)
popup.show()
}
Этот подход «работает» в том смысле, что он показывает всплывающее меню и позволяет мне удалять элементы, но У меня возникла новая проблема, заключающаяся в том, что когда элемент / строка удаляется, он не отображается до тех пор, пока представление не будет воссоздано, сейчас я не наблюдаю свои данные, так что это может быть причиной, почему, но что я Интересно, что будет лучшим подходом для достижения этой цели? Примечание: я попробовал добавить еще один атрибут android:onClick
в xml и попытаться обработать это в MainActivity
, но я не уверен, какой подход выбрать здесь. Можно ли достичь первого? В идеале, я бы имел:
android:onClickListener="@{(v) -> holder.showPopup.invoke(model, v)}"
и затем эту showPopup
функцию в ViewHolder
.