Функция 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 и т. д.

Другие вопросы по тегам