У меня есть привязанный к данным макет с 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](https://i.stack.imgur.com/HV6vV.png)