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 の前に実行するのが早すぎるようです。