#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, я немного запутался