Pagination RecyclerView
Всем привет. Изучаю разработку на системе андроид и при пагинации списка получается следующее: при ответе от Retrofit мне приходит объект Movie,хранящий в себе список фильмов. При пагинации через метод addOnScrollListener получается так, что при прокрутке вниз первая страница заменяется второй и далее наверх уже нельзя проскроллить. Такое ощущение, что адаптер пересоздаётся, а не расширяется.
movieListRecycler?.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val totalItem: Int = layoutManager.itemCount
val lastVisibleItem: Int = layoutManager.findLastVisibleItemPosition()
scope.launch {
if (!isLoading && lastVisibleItem == totalItem - 1) {
isLoading = true
PAGE_NUMB++
movieListAdapter = MovieListAdapter(loadMovies(), this@FragmentMoviesList)
movieListRecycler?.adapter = movieListAdapter
movieListAdapter.notifyDataSetChanged()
isLoading = false
}
}
}
})
Код адаптера
class MovieListAdapter(
private var listMovies: Movie,
private val cellClickListener: CellClickListener?
) : RecyclerView.Adapter<MovieListAdapter.MovieListViewHolder>() {
val scope = CoroutineScope(Dispatchers.Main)
inner class MovieListViewHolder(view: View) : RecyclerView.ViewHolder(view) {
private var imageMain: ImageView? = null
private var titleName: TextView? = null
private var duration: TextView? = null
private var numbReviews: TextView? = null
private var age: ImageView? = null
var genre: TextView? = null
private var like: ImageView? = null
private var stars: RatingBar? = null
init {
imageMain = itemView.findViewById(R.id.movie_img)
titleName = itemView.findViewById(R.id.cinema_title)
duration = itemView.findViewById(R.id.duration)
numbReviews = itemView.findViewById(R.id.name)
age = itemView.findViewById(R.id.ageRate)
genre = itemView.findViewById(R.id.tag)
like = itemView.findViewById(R.id.toLike)
stars = itemView.findViewById(R.id.rating)
}
fun bind(movie: Movie) {
scope.launch {
val config = RetrofitModule.moviesApi.getConfig(API_KEY)
val strUrl: String =
config.images?.secureBaseUrl + config.images?.posterSizes?.get(4) + movie.results?.get(
adapterPosition
)?.posterPath
imageMain!!.load(strUrl)
titleName?.text = movie.results?.get(adapterPosition)?.title
val movieInfoRequest = RetrofitModule.moviesApi.getMovieInfo(
movie.results?.get(index = adapterPosition)?.id!!,
API_KEY
)
Log.d("duration", movieInfoRequest.toString())
duration?.text = movieInfoRequest.runtime.toString().plus(" MIN")
genre?.text = movieInfoRequest.genres?.map { it!!.name }!!.joinToString()
stars?.rating = movie.results?.get(adapterPosition)?.voteAverage!! * 0.5F
numbReviews?.text = movieInfoRequest.voteCount.toString().plus(" REVIEWS")
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieListViewHolder {
return MovieListViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.view_holder_movie, parent, false)
)
}
override fun onBindViewHolder(holder: MovieListViewHolder, position: Int) {
val movieList: Movie = listMovies
holder.bind(movieList)
holder.itemView.setOnClickListener {
cellClickListener?.onCellClickListener(holder.itemView, position)
}
}
override fun getItemCount(): Int {
return listMovies.results?.size!!
}
}
interface CellClickListener {
fun onCellClickListener(view: View, position: Int)
}