Как наблюдать переменные-члены класса в MutableLiveData? - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь наблюдать поля моего класса, не выставляя это.До сих пор я пробовал это:

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)

, и проблема решена, а представление обновляется.

...