Метод submitList не обновляет список для ListAdapter
Я использую ListAdapter для своего RecyclerView. В активити Адаптер инициализируется с пустым списком, а затем я с помощью submitList() хочу загрузить в него новый, полученный из запроса, но всё равно отображается тот список, что я положил при инициализации. Подскажите пожалуйста, что то забыл сделать, чтобы submitList() работал корректно.
Адаптор:
viewModel.getSearchRep().observe(this){
rep -> trackAdapter = TrackAdapter(listOf(), rep, trackOnClicked)
}
viewModel.getStatesSearch().observe(this){
searchStates = it.responseStates
trackAdapter.submitList(it.response?.results)
...
}
Строка настройки и создания ListAdapter:
package com.example.playlistmaker.search.ui
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import com.example.playlistmaker.databinding.TrackViewBinding
import com.example.playlistmaker.search.domain.api.SearchHistoryRepository
import com.example.playlistmaker.search.domain.api.TrackOnClicked
import com.example.playlistmaker.search.domain.models.Track
class TrackAdapter(
private val items: List<Track>?,
private val searchHistory: SearchHistoryRepository,
private val trackOnClicked: TrackOnClicked
) : ListAdapter<Track,TrackViewHolder>(ItemComparator()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrackViewHolder {
val layoutInspector = LayoutInflater.from(parent.context)
return TrackViewHolder(TrackViewBinding.inflate(layoutInspector, parent, false))
}
override fun onBindViewHolder(holder: TrackViewHolder, position: Int) {
holder.bind(items!![position])
holder.itemView.setOnClickListener {
searchHistory.save(items[position])
trackOnClicked.getTrackAndStart(items[position])
}
}
override fun getItemCount(): Int {
return items!!.size
}
}
Ответы (2 шт):
Нагуглил ответ на основном SO.
Если передавать тот же List
в ListAdapter#submitList()
, то ListAdapter
проигнорирует его:
public void submitList(final List<T> newList) {
if (newList == mList) {
// nothing to do
return;
}
}
Попробуйте каждый раз передавать в ListAdapter#submitList()
вновь созданный List
, либо вызывайте RecyclerView.Adapter#notifyDataSetChanged()
после обновления данных в List
.
Вы неправильно используете ListAdapter
- он уже содержит в себе список и внутри адаптера вы должны работать с этим списком, а не с собственным:
class TrackAdapter(
/*private val items: List<Track>?,*/ // список здесь не нужен - он уже есть в ListAdapter
private val searchHistory: SearchHistoryRepository,
private val trackOnClicked: TrackOnClicked
) : ListAdapter<Track,TrackViewHolder>(ItemComparator()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrackViewHolder {
val layoutInspector = LayoutInflater.from(parent.context)
return TrackViewHolder(TrackViewBinding.inflate(layoutInspector, parent, false))
}
override fun onBindViewHolder(holder: TrackViewHolder, position: Int) {
// объект берём из ListAdapter его методом getItem()
val item = getItem(position)
holder.bind(item)
holder.itemView.setOnClickListener {
searchHistory.save(item)
trackOnClicked.getTrackAndStart(item)
}
}
/*
// этот метод переопределять не нужно - он реализован в ListAdapter
override fun getItemCount(): Int {
return items!!.size
}*/
}
Данные в адаптер (в том числе начальные) следует передавать исключительно методом submitList()
и никак иначе.