android:kotlin:实现分页 3 时数据未加载到适配器中

android: kotlin: Data not loading in adapter while implementing paging 3

我正在我的应用程序中实现分页 3。

我尝试遵循 google 代码实验室和 overview on paging 3 from documentation

但是无法显示适配器中的数据,我将日志放入适配器中,但 logcat 上没有显示来自适配器的日志。

我尝试调试 codelabs 代码,数据流与我的完全一样,因为我不能(或不知道)如何干预在片段流中接收的分页,我无法判断如果我的片段收到数据。我也从未使用过 adapter.submitdata() 和协程的新手,我不确定它是否可能是问题所在的范围。

感谢任何帮助。提前致谢。

祝你有愉快的一天。

片段

        transactionsAdapterPaging = TransactionsPagedListAdapter()
        homeFragmentDataBinding.transactionsRV.apply {
            layoutManager = LinearLayoutManager(requireContext())
            setHasFixedSize(true)
            adapter = transactionsAdapterPaging
        }

        homeFragmentDataBinding.transactionsRV.adapter = transactionsAdapterPaging

        lifecycleScope.launch {
            mainViewModel.getDataFromRemote().collectLatest {
                Log.e(TAG, "initializeTransactionAdapter:  ++++++++====== " + it.toString())
                transactionsAdapterPaging.submitData(it)

            }
        }

视图模型

    private var currentSearchResult: Flow<PagingData<TransactionDetail>>? = null

    fun getDataFromRemote(): Flow<PagingData<TransactionDetail>> {
        val lastResult = currentSearchResult
        val newResult: Flow<PagingData<TransactionDetail>> = mainRepository.getDataFromRemote()
            .cachedIn(viewModelScope)
        currentSearchResult = newResult
        return newResult
    }

存储库

    fun getDataFromRemote(): Flow<PagingData<TransactionDetail>> {
        return Pager(
            config = PagingConfig(pageSize = 1, enablePlaceholders = false),
            pagingSourceFactory = { TransactionsDataSource() }
        ).flow
    }

数据源

class TransactionsDataSource() : PagingSource<Int, TransactionDetail>() {
    private val TAG = "UserDataSource"
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, TransactionDetail> {

        val position = params.key ?: 1
        return try {
            lateinit var transactionDetail: List<TransactionDetail>

            var response: Response<Any?>? = NewAPIServiceClient.getAllTransactionsPaging(
                Application.getInstance(),
                Prefs.getString(Constants.CARD_UUID_IN_USE, ""),
                position,
                null
            )

            Log.e(TAG, "load: " + response)

            if (response != null &&  response.isSuccessful) {
                if (response?.body() != null) {

                    val gson = Gson()
                    try {
                        val jsonObject1 = JSONObject(gson.toJson(response?.body()))
                        val transactionsGson = jsonObject1.getJSONArray(Constants.PN_DATA_NEW)
                        transactionDetail = gson.fromJson(
                            transactionsGson.toString(),
                            object : TypeToken<List<TransactionDetail>?>() {}.type
                        )
                    } catch (e:Exception){

                    }
                }
            }

            val repos = transactionDetail

            Log.e(TAG, "load: ===== " + repos.toString()  )

            return LoadResult.Page(
                data = repos,
                prevKey = if (position == 1) null else position - 1,
                nextKey = if (repos.isEmpty()) null else position + 1
            )



        } catch (exception: IOException) {
            Log.e(TAG, "load: 11111111111111111 " + exception )
            LoadResult.Error(exception)
        } catch (exception: HttpException) {
            Log.e(TAG, "load: 11111111111111111 " + exception )
            LoadResult.Error(exception)
        }


    }

}

适配器

class TransactionsPagedListAdapter() :
    PagingDataAdapter<TransactionDetail, RepoViewHolder>(
        DIFF_CALLBACK
    ) {
    private val TAG = "AdapterPaging"
    private var serviceListFiltered: List<TransactionDetail>? = null

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): RepoViewHolder {
        Log.e(TAG, "onCreateViewHolder: ")
        val itemBinding: RvListItemTransactionsHomeBinding =
            RvListItemTransactionsHomeBinding.inflate(
                LayoutInflater.from(parent.context),
                parent,
                false
            )
        return RepoViewHolder(itemBinding)
    }

    override fun onBindViewHolder(
        holder: RepoViewHolder,
        position: Int
    ) {
        Log.e(TAG, "onBindViewHolder: ")
        val repoItem = getItem(position)
        if (repoItem != null) {
            (holder).bind(repoItem, position)
        }
    }

    override fun getItemCount(): Int {
        return if (serviceListFiltered == null) {
            0
        } else serviceListFiltered!!.size
    }


    companion object {
        val DIFF_CALLBACK = object : DiffUtil.ItemCallback<TransactionDetail>() {
            override fun areItemsTheSame(oldItem: TransactionDetail, newItem: TransactionDetail) =
                oldItem.uuid == newItem.uuid


            override fun areContentsTheSame(
                oldItem: TransactionDetail,
                newItem: TransactionDetail
            ) =
                oldItem == newItem

        }
    }


}


class RepoViewHolder internal constructor(itemBinding: RvListItemTransactionsHomeBinding) :
    RecyclerView.ViewHolder(itemBinding.getRoot()), View.OnClickListener {
    private val mDataBinding: RvListItemTransactionsHomeBinding = itemBinding
    var rootView: View
    fun bind(invoice: TransactionDetail, position: Int) {
        rootView.transaction_text_title.text = invoice.merchant?.merchantName
        var amountWithSymbol =
            Utilities.getFormattedAmount(
                Application.getInstance()?.applicationContext,
                invoice.amount.toString()
            )
        rootView.transaction_amount.text = amountWithSymbol
        rootView.transactions_date.text = invoice.timestamp
    }

    override fun onClick(view: View) {
        if (adapterPosition > RecyclerView.NO_POSITION) {
        }
    }

    init {
        val itemView: View = itemBinding.getRoot()
        rootView = mDataBinding.constraintContainer
        itemView.setOnClickListener(this)
    }
}
`override fun getItemCount(): Int {
    return if (serviceListFiltered == null) {
        0
    } else serviceListFiltered!!.size
}`

不要在您的 recyclerview 适配器中覆盖 getItemCount。