Как я могу обновить представление элементов из моей модели представления в режиме рециркуляции? - PullRequest
0 голосов
/ 10 апреля 2020

Как я могу обновить представление элементов из моего вида представления в рециркуляторе?

ViewModel

class HandlerViewModel(application: Application): AndroidViewModel(application) {

    fun update(data: Data, isActive: Boolean) {
        // calls a helper function that calls the backend then returns true or false.
        val result: Boolean = callBackend(data, isActive)
    }
}

Поэтому, когда пользователь щелкает элемент в представлении рециркулятора, я назову это update() функция. Я хочу затем изменить цвет элемента в списке в зависимости от результата, который я получаю от бэкэнда. Как мне использовать LiveData для этого?

Обычно, если это только один элемент stati c, я могу легко это сделать, но если это представление переработчика размера n, то как я могу связать его с LiveData

1 Ответ

0 голосов
/ 10 апреля 2020

Если вы не используете привязку данных, вы можете попробовать что-то вроде этого. Создайте новое поле внутри вашего объекта данных, которое представляет логическое значение для альтернативного цвета. Таким образом, в вашем адаптере вы можете сделать это в себе onBind:

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
    val data = adapterList[position]

    if(data.otherColor) {
        viewholder.textView.color = Color.Red
    } else {
        viewholder.textView.color = Color.Black
    }
}

И затем:

// inside your viewModel
private val _singleData = MutableLiveData<Data>()
val singleData: LiveData<Data>
    get() = _singleData

fun update(data: Data, isActive: Boolean) {
    val result: Boolean = callBackend(data, isActive)
    data.otherColor = result
    _singleData.value = data
}

// inside your activity
handlerViewModel.singleData.observe(this, Observer { singleData ->
    val index = adapter.adapterList.indexOfFirst { singleData.id == it.id }
    adapterList[index] = singleData
    adapter.notifyItemChanged(index)
}

Или, если вы хотите наблюдать и обновлять весь набор данных:

// inside your viewModel
private val _allData = MutableLiveData<List<Data>>()
val allData: LiveData<List<Data>>
    get() = _allData

fun update(data: Data, isActive: Boolean) {
    val result: Boolean = callBackend(data, isActive)

    val listToUpdate = allData.value
    listToUpdate.find { it.id == data.id }.otherColor = result

    _allData.value = listToUpdate
}

// inside your activity
handlerViewModel.allData.observe(this, Observer { rvData ->
    adapter.clear()
    adapter.addAll(rvData)
    adapter.notifydatasetChanged()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...