Я пытаюсь наблюдать поля моего класса, не выставляя это.До сих пор я пробовал это:
TaskItemViewModel.kt
open class TaskItemViewModel(private val navigator: ITaskNavigator) : ViewModel() {
private val taskItem: MutableLiveData<TaskItem> = MutableLiveData()
val title: LiveData<String?> = Transformations.map(taskItem) { it.title }
val content: LiveData<String?> = Transformations.map(taskItem) { it.content }
var showCheck: LiveData<Boolean> = Transformations.map(taskItem) { it.isCompleted }
fun setModel(model: TaskItem) {
this.taskItem.value = model
}
}
ItemListScreenAdapter.kt
class ItemListScreenAdapter(private val navigator: ITaskNavigator) : RecyclerView.Adapter<ItemListScreenAdapter.TaskItemViewHolder>() {
private val TAG = "ItemListScreenAdapter"
private var dataset: List<TaskItem> = listOf()
override fun onBindViewHolder(viewHolder: TaskItemViewHolder, position: Int) {
with(viewHolder.binding) {
this.viewModel?.setModel(dataset[position])
executePendingBindings()
}
}
fun updateDataset(dataset: List<TaskItem>) {
Log.d(TAG,"Updating dataset")
this.dataset = dataset
notifyDataSetChanged()
}
override fun getItemCount(): Int = dataset.size
override fun onCreateViewHolder(parent: ViewGroup, type: Int): TaskItemViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = ItemTaskBinding.inflate(inflater, parent, false)
binding.viewModel = TaskItemViewModel(navigator)
return TaskItemViewHolder(binding)
}
class TaskItemViewHolder(val binding: ItemTaskBinding) : RecyclerView.ViewHolder(binding.root)
}
Если я вызываю setModel перед надуванием представления, все работаетхорошо.Однако после того, как представление надувается, оно не обновляется, даже если значение taskItem
обновлено.Вы можете быть уверены, что updateDataset
вызывается каждый раз, когда происходит изменение в наборе данных.
Я хочу, чтобы представление обновлялось всякий раз, когда я вызываю setModel
в соответствующей модели представления.Каковы способы достижения этого?
Для этой модели представления я хочу использовать ViewModel
вместо BaseObservable
.Поэтому, пожалуйста, дайте свои ответы в соответствии с этим.
РЕДАКТИРОВАТЬ: Я нашел решение проблемы.
в методе ItemListScreenAdapter
onCreateViewHolder
, после надувания мне нужно было установить LifeCycleOwner
привязки.
После добавления ItemTaskBinding я добавил следующую строку.
binding.setLifecycleOwner(parent.context as MainActivity)
, и проблема решена, а представление обновляется.