[英]How to implement nested paging in android kotlin?
我有一個 recyclerview,因為我將 pagin 3 與協程實時數據一起使用。 但是子 recyclerview 也有分頁數據,所以我如何在 android kotlin 中執行此嵌套分頁。
因此,我通過在 recyclerview 中對子 recyclerview 進行分頁來完成此操作。 首先調用 api 獲取日期,並在獲取日期的同時對每個日期執行 api。
所以像這樣的結構......
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)
}
}
}
})
}
}
}
每周適配器
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
<?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
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 )
}
}
**在視圖模型中**
fun getDayAcquiringDetails( date: String ) = apiHelper.getDayAcquiringDetails( date ).cachedIn(viewModelScope)
fun weeklyAcquiringDetails( filter: String , date: String) = apiHelper.weeklyAcquiringDetails( filter , date)
希望你喜歡這個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.