ListAdapter android не работает submitList()
Есть список фильмов, который расположен в RecyclerView. Пытаюсь перейти на ListAdapter чтобы обновлять с использованием submitList(), однако ничего не выводится при использовании этого метода, в то время как при обновлении обычным способом через adapter.bind все работает.
class MovieListAdapter(private val clickListener: MoviesClicks?) :
ListAdapter<Movie, MovieViewHolder>(MovieDiffCallback()) {
private var movies: List<Movie> = listOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {
val itemBinding =
ItemMovieCardBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return MovieViewHolder(itemBinding)
}
override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
holder.onBind(movies[position])
holder.itemView.setOnClickListener {
clickListener?.movieClick(movies[position])
}
}
override fun getItemCount(): Int {
return movies.size
}
fun bindCards(cards: List<Movie>) {
movies = cards
}
}
class MovieViewHolder(private val itemBinding: ItemMovieCardBinding) :
RecyclerView.ViewHolder(itemBinding.root) {
companion object {
private val imageOption = RequestOptions()
.placeholder(R.drawable.bg)
.fallback(R.drawable.bg)
}
fun onBind(movie: Movie) {
itemBinding.tvFilmName.text = movie.title
Log.i(TAG, "image: ${movie.imageUrl}");
Log.i(TAG, "text: ${movie.title}");
Log.i(TAG, "Thread: ${Thread.currentThread().name}");
Glide.with(context)
.load(movie.imageUrl)
.apply(imageOption)
.into(itemBinding.ivMovieCard)
bindStars(movie.rating, itemBinding)
itemBinding.tvGenre.text = movie.genres.joinToString { genre -> genre.name }
itemBinding.tvCardCountReviews.text =
context.getString(R.string.reviews, movie.reviewCount.toString())
}
private fun <B> bindStars(movieRating: Int, binding: B) {
val rating = movieRating / 2.0
if (binding is ItemMovieCardBinding) {
if (rating < 4.5) {
binding.ivCardStar5.setColorFilter(
ContextCompat.getColor(
context,
R.color.textColor
)
)
}
if (rating < 3.5) {
binding.ivCardStar4.setColorFilter(
ContextCompat.getColor(
context,
R.color.textColor
)
)
}
if (rating < 2.5) {
binding.ivCardStar3.setColorFilter(
ContextCompat.getColor(
context,
R.color.textColor
)
)
}
if (rating < 1.5) {
binding.ivCardStar2.setColorFilter(
ContextCompat.getColor(
context,
R.color.textColor
)
)
}
if (rating < 0.5) {
binding.ivCardStar1.setColorFilter(
ContextCompat.getColor(
context,
R.color.textColor
)
)
}
}
}
private class MovieDiffCallback : DiffUtil.ItemCallback<Movie>() {
override fun areItemsTheSame(oldItem: Movie, newItem: Movie): Boolean =
(oldItem.id == newItem.id)
override fun areContentsTheSame(oldItem: Movie, newItem: Movie): Boolean = (oldItem == newItem)
}
class MoviesListFragment : Fragment() {
private val viewModel: MovieListViewModel by viewModels {
MovieListViewModelFactory(requireContext())
}
private var columnCount = 2
private var listener: MoviesClicks? = null
private lateinit var adapter: MovieListAdapter
private lateinit var coroutineScope: CoroutineScope
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
columnCount = it.getInt(ARG_COLUMN_COUNT)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_movies_list, container, false)
val recycler = view.findViewById<RecyclerView>(R.id.rv_movie_cards)
coroutineScope = CoroutineScope(context = Dispatchers.IO)
adapter = MovieListAdapter(listener)
recycler.layoutManager = GridLayoutManager(context, 2)
recycler.adapter = adapter
viewModel.moviesList.observe(this.viewLifecycleOwner, this::updateAdapter)
viewModel.loadMovies()
return view
}
/* override fun onStart() {
super.onStart()
// updateData()
}
private fun updateData() {
coroutineScope.launch {
adapter.bindCards((JsonMovieRepository(requireContext())).loadMovies())
launch(Dispatchers.Main) { adapter.notifyDataSetChanged() }
}
}*/
private fun updateAdapter(movies: List<Movie>) {
adapter.bindCards(movies)
coroutineScope.launch(Dispatchers.Main) { adapter.notifyDataSetChanged() }
}
companion object {
const val ARG_COLUMN_COUNT = "column-count"
@JvmStatic
fun newInstance(columnCount: Int) =
MoviesListFragment().apply {
arguments = Bundle().apply {
putInt(ARG_COLUMN_COUNT, columnCount)
}
}
}
fun setClickListener(l: MoviesClicks?) {
listener = l
}
}