0
 mAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
                if (positionStart == 0) {
                    LogUtils.d("================= scroll to top")
                    binding.rv.layoutManager?.scrollToPosition(0)
                    autoScrollToStartFlag = false
                }
            }
        })

新しいアイテムが挿入されたときにrecyclerView を一番上までスクロールさせたいのですが、上記のコードで問題なく動作します。次に、次のコードを使用してセパレーターを recyclerVeiw に追加しましたが、 binding.rv.layoutManager?.scrollToPosition(0)機能しなくなりました。

Pager(...)
    .flow
    .map { pagingData ->
            pagingData.map {
                UiModel.SyncUiModel(it)
            }
                .insertSeparators<UiModel.SyncUiModel, UiModel>{ model: UiModel.SyncUiModel?, model2: UiModel.SyncUiModel? ->
                    LogUtils.d("================= before: ${model?.id ?: "empty"} after: ${model2?.id ?: "empty"}")
                    if (model == null) return@insertSeparators UiModel.SeparatorModel("head")
                    if (model2 == null) return@insertSeparators UiModel.SeparatorModel("foot")
                    return@insertSeparators null
                }
        }.cachedIn(viewModelScope)

ログ:

================= scroll to top
================= before: empty after: 953
================= before: 953 after: 952
================= before: 952 after: 950
================= before: 950 after: 949
================= before: 949 after: 946
================= before: 946 after: 944
================= before: 944 after: 937

binding.rv.layoutManager?.scrollToPosition(0)insertSeparators の前に実行するのが早すぎるようです。

4

0 に答える 0