[英]How to implement nested paging in android kotlin?
I have a recyclerview, for i using pagin 3 with coroutine live data.我有一个 recyclerview,因为我将 pagin 3 与协程实时数据一起使用。 but child recyclerview also have paginate data so how can i perform this nested pagination in android kotlin.
但是子 recyclerview 也有分页数据,所以我如何在 android kotlin 中执行此嵌套分页。
So, I done this with pagination for child recyclerview inside recyclerview.因此,我通过在 recyclerview 中对子 recyclerview 进行分页来完成此操作。 Firstly of all call api for fetch dates and perform api for every date at same time when date are fetching.
首先调用 api 获取日期,并在获取日期的同时对每个日期执行 api。
so structure like this...所以像这样的结构......
lateinit var adapter: WeeklyAdapter
lateinit var dayAdapter: DayDetailsPagingAdapter
private fun observeData() {
viewModel.weeklyAcquiringDetails(AcquiringVM.WEEKLY, "").observe(this){
wsWithLoader(it){
binding.rvAcquiringWeeklyDetails.adapter = WeeklyAdapter(it.data!!.data, object : WeeklyAdapter.OnPerformApi{
override fun performApi(date: String, rvMonthly: RecyclerView) {
dayAdapter = DayDetailsPagingAdapter(object : DayDetailsPagingAdapter.OnClick{
override fun onClick(result: DayAcquiring.Data) {}
})
rvMonthly.adapter = dayAdapter
lifecycleScope.launchWhenCreated {
viewModel.getDayAcquiringDetails(date).collectLatest { data ->
dayAdapter.submitData(data)
}
}
}
})
}
}
}
Weekly Adapter
每周适配器
class WeeklyAdapter ( val list: List<WeeklyAcquiring.Data>, val action: OnPerformApi ): RecyclerView.Adapter<WeeklyAdapter.ViewHolder>() { class WeeklyAdapter ( val list: List<WeeklyAcquiring.Data>, val action: OnPerformApi ): RecyclerView.Adapter<WeeklyAdapter.ViewHolder>() {
@NonNull
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), R.layout.list_monthly, parent, false))
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val result = list[position]
holder.binding.apply {
tvDate.text = changeDateFormat(result.doctorScheduleDate,"yyyy-MM-dd","E, dd MMM yyyy")
action.performApi( result.doctorScheduleDate , rvMonthly)
}
}
override fun getItemCount(): Int {
return list.size
}
inner class ViewHolder(binding: ListMonthlyBinding) : BaseViewHolder<ListMonthlyBinding>(binding) {}
interface OnPerformApi{
fun performApi(date : String, rvMonthly: RecyclerView)
}
}
list_monthly_layout
list_monthly_layout
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvDate"
style="@style/TVBold"
android:layout_marginTop="@dimen/_5sdp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/_12sdp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="May 2022" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMonthly"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_10sdp"
app:layout_constraintEnd_toEndOf="parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintStart_toStartOf="parent"
tools:listitem="@layout/list_acquiring_details"
app:layout_constraintTop_toBottomOf="@+id/tvDate" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
DayDetailsPagingAdapter
DayDetailsPagingAdapter
class DayDetailsPagingAdapter (private val onClick: OnClick) : PagingDataAdapter<DayAcquiring.Data, DayDetailsPagingAdapter.ViewHolder>(DiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(ListAcquiringDetailsBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val result = getItem(position)!!
holder.binding.apply {
data = result
tvName.text = result.userName
tvAmount.text = "€ ${result.amount}"
}
}
class ViewHolder(val binding: ListAcquiringDetailsBinding) : RecyclerView.ViewHolder(binding.root) {}
private class DiffCallback : DiffUtil.ItemCallback<DayAcquiring.Data>() {
override fun areItemsTheSame(
oldItem: DayAcquiring.Data,
newItem: DayAcquiring.Data
): Boolean = oldItem == newItem
override fun areContentsTheSame(
oldItem: DayAcquiring.Data,
newItem: DayAcquiring.Data
): Boolean = oldItem == newItem
}
interface OnClick {
fun onClick(result: DayAcquiring.Data )
}
}
**in viewmodel **
**在视图模型中**
fun getDayAcquiringDetails( date: String ) = apiHelper.getDayAcquiringDetails( date ).cachedIn(viewModelScope)
fun weeklyAcquiringDetails( filter: String , date: String) = apiHelper.weeklyAcquiringDetails( filter , date)
hope you like this.希望你喜欢这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.