Функция diffutil areContentsTheSame сравнивает только новые элементы
Я использую AsyncListDiffer в своем проекте, в котором у меня много цитат на главной странице
Ниже приведен код, который я написал в своем адаптере recyclerview.
private val diffCallback = object : DiffUtil.ItemCallback<Quote>() {
override fun areItemsTheSame(oldItem: Quote, newItem: Quote): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Quote, newItem: Quote): Boolean {
Log.d("mytag", "$oldItem , $newItem")
return oldItem == newItem
}
}
Когда я что-то меняю в объекте цитаты, я отправляю это в ListDiffer. И, как вы можете видеть, я регистрирую внутри newItem и oldItem
areContentsTheSame
функция. Здесь оба
oldItem
и
newItem
- это те же объекты (я имею в виду, что их содержимое - это тот, который я недавно обновил), и я думаю, что oldItem должен дать мне старый необновленный элемент, но он не
(Я уже пытался сделать копию списка, а затем отправить его, чтобы он отличался, это не работает)
fun updateQuote(quoteId :String,newQuote: Map<String,String>) = viewModelScope.launch(Dispatchers.IO) {
_updateQuote.postValue(DataState.Loading())
val response = mainRepository.updateQuote(quoteId, newQuote)
val handledResponse = handleQuoteResponse(response)
val quoteToUpdate = quoteList.find { quote -> quote.id == quoteId}
quoteToUpdate?.genre = newQuote["genre"]
quoteToUpdate?.quote = newQuote["quote"]
_quotes.postValue(DataState.Success(QuotesResponse(quoteList.map { it.copy() })))
_updateQuote.postValue(handledResponse)
}
1 ответ
Я видел несколько сообщений, которые помогли мне с этой проблемой. Но в конце концов моя проблема заключалась в том, что я сравнивал переменную типаvar
в моем классе данных. Я думаю, что она каким-то образом сохранила ссылку на старый список. Поэтому я советую всем, кто увидит этот ответ, искать места, где их переменные или списки могут иметь одинаковую ссылку. Пример: изменяемый список, var и т. д.