SeekBar Двухстороннее связывание данных не обновляет TextView - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть привязанный к данным макет с SeekBar и TextView, который должен показывать выбранное значение. Сначала это работает, но этот макет находится внутри RecyclerView с другими макетами с привязкой к данным, после небольшой прокрутки он перестает работать (TextView перестает обновляться при изменении выбранного значения). Я предполагаю, что это может быть проблема с адаптером и связыванием logi c, но мне нужна помощь, чтобы определить его.

Это файл макета (удалены другие представления, поля и ограничения, чтобы сделать его более читабельным ):

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type=".EffectUiModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <SeekBar
            android:id="@+id/seekBarValue"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:max="100"
            android:progress="@={viewModel.seekSelection}"
             />

        <TextView
            android:id="@+id/txtSeekBarValue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.seekSelection.toString()}"
            />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

и это модель данных:

class EffectUiModel(effect: Effect) : DataBoundModel(R.layout.effect_list_item) {

    val name = MutableLiveData<String>().apply { value = effect.name }
    val description = MutableLiveData<String>().apply { value = effect.description }
    val type = MutableLiveData<EffectType>().apply { value = effect.type }
    val seekSelection = MutableLiveData<Int>()
}

Эта модель данных расширяется от DataBoundModel, как вы можете видеть, она просто содержит идентификатор макета и использует его для Логика рециркуляции c:

open class DataBoundModel(@LayoutRes val layout: Int)

Вся идея в том, что у меня может быть представление Recycler View с различными моделями с привязкой к данным внутри, а утилизация и привязка должны работать автоматически (и до сих пор кроме этого случая). Вот адаптер:

class DataBoundRecyclerAdapter(val items: List<DataBoundModel>) : RecyclerView.Adapter<DataBoundViewHolder>() {

    override fun getItemViewType(position: Int): Int {
        return items[position].layout
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBoundViewHolder {
        val binding: ViewDataBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context), viewType, parent, false)
        return DataBoundViewHolder(binding).also { binding.lifecycleOwner = it }
    }


    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(holder: DataBoundViewHolder, position: Int) {
        holder.binding.setVariable(BR.viewModel, items[position])
        holder.binding.executePendingBindings()
    }

    override fun onViewAttachedToWindow(holder: DataBoundViewHolder) {
        super.onViewAttachedToWindow(holder)
        holder.markAttach()
    }

    override fun onViewDetachedFromWindow(holder: DataBoundViewHolder) {
        super.onViewDetachedFromWindow(holder)
        holder.markDetach()
    }

}

, а вот ViewHolder:

class DataBoundViewHolder(val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root), LifecycleOwner {

    private val lifecycleRegistry = LifecycleRegistry(this)

    fun markAttach() {
        lifecycleRegistry.currentState = Lifecycle.State.STARTED
    }

    fun markDetach() {
        lifecycleRegistry.currentState = Lifecycle.State.DESTROYED
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }

}

Затем я просто создаю модели с привязкой к данным и добавляю их в список, затем создаю адаптер и установите это в представление переработчика. Что может быть здесь не так?

РЕДАКТИРОВАТЬ:

Вот изображение макета после того, как он содержит ошибки, исходное значение было null, я выбрал 85, прокручивал вниз на экране рециркулятора , вернулся, панель поиска правильно помечала 85, но после ее изменения текст больше не обновлялся:

Image Showing the error

...