Itemviewtype не работает с recyclerview и библиотекой подкачки 2

#android #kotlin #android-recyclerview #pagination

#Android #kotlin #android-recyclerview #разбивка на страницы

Вопрос:

У меня есть приложение, в котором я использую библиотеку подкачки 2, данные отображаются без каких-либо проблем, сейчас я пытаюсь реализовать элементы viewtypes для данных и прогресса, я устанавливаю размер страницы не более 10 элементов, я хочу, чтобы пользователь прокручивал вниз, когда он добирается до последнего элемента, я показываю progressbar сразу после загрузки нового фрагмента данных, но я не мог хорошо понять, как справиться с этой логикой, это то, что я сделал до сих пор, заранее благодарю вас за любую помощь

Логика должна быть следующей:

* Загрузка 10 элементов * Ход загрузки * Загрузка 10 элементов * Ход загрузки и так далее

  class PlayNowMoviesAdapter(private val context: Context, private var movieListener: MovieListener)
    : PagedListAdapter<MoviesDataModel, PlayNowMoviesAdapter.MyViewHolder>(callback) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        var viewHolder : MyViewHolder?  = null
        when (viewType) {
            ExtrasClass.ITEM_VIEW_TYPE_DATA -> {
                val movieBinding: MovieslayoutBinding = DataBindingUtil.inflate(LayoutInflater.from(context),
                        R.layout.movieslayout, parent, false)
                viewHolder = MyViewHolder(movieBinding)
                return viewHolder
            }
            ExtrasClass.ITEM_VIEW_TYPE_PROGRESS -> {
                val progressBinding : ProgresslayoutBinding = DataBindingUtil.inflate(LayoutInflater.from(context),
                        R.layout.progresslayout, parent, false)
                viewHolder = MyViewHolder(progressBinding)
                return viewHolder
            }
        }

        return viewHolder!!

    }

    class MyViewHolder : RecyclerView.ViewHolder {
        var movieBinding: MovieslayoutBinding? = null
         var progressBinding: ProgresslayoutBinding? = null

        constructor(binding: MovieslayoutBinding) : super(binding.root) {
            movieBinding = binding
        }

        constructor(binding: ProgresslayoutBinding) : super(binding.root) {
            progressBinding = binding
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val moviesModel = getItem(position)
         when(holder.itemViewType){
             ExtrasClass.ITEM_VIEW_TYPE_DATA -> {
                // holder.progressBinding?.progressBar?.visibility = View.INVISIBLE
                 holder.movieBinding?.model = moviesModel
                 holder.movieBinding?.movieRating?.numStars = moviesModel!!.vote_average.toDouble().toInt()
                 holder.movieBinding?.listener = movieListener
             }
             ExtrasClass.ITEM_VIEW_TYPE_PROGRESS -> {
                 holder.progressBinding?.progressBar?.visibility = View.VISIBLE
             }
         }
    }

    override fun getItemViewType(position: Int): Int {
        return if (getItem(position) != null ) {
            ExtrasClass.ITEM_VIEW_TYPE_DATA
        } else {
            ExtrasClass.ITEM_VIEW_TYPE_PROGRESS
        }
    }

    companion object {
        private val callback: DiffUtil.ItemCallback<MoviesDataModel> = object : DiffUtil.ItemCallback<MoviesDataModel>() {
            override fun areItemsTheSame(oldItem: MoviesDataModel, newItem: MoviesDataModel): Boolean {
                return oldItem.id == newItem.id
            }

            @SuppressLint("DiffUtilEquals")
            override fun areContentsTheSame(oldItem: MoviesDataModel, newItem: MoviesDataModel): Boolean 
              {
                return oldItem == newItem
            }
        }
    }
 

Комментарии:

1. я думаю, вам следует использовать два viewholders один для прогресса, а другой для данных

2. Я уже сделал это, у меня есть макет для панели выполнения и макет для самих данных, если вы проверите метод onCreateViewHolder() , вы увидите, что я его реализовал, но я совершенно не понимаю логики в getItemViewType() , должен ли я проверять положение типа itemview или для последнегоположение в recyclerview, я немного запутался