Показать всплывающее меню для строки в представлении реселлера, используя привязку данных - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь показать всплывающее меню для элементов в моем RecyclerView: enter image description here

Все примеры кода о том, как это сделать, которые я нашел в Интернете, либо используют 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.

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