簡體   English   中英

android kotlin如何實現嵌套分頁?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM