OnScrolled в LazyColumnFor (составление Jetpack)

Кто-нибудь может найти эквивалент onScrolled (@NonNull RecyclerView recyclerView, int dx, int dy) в LazyColumnFor, спасибо

3 ответа

Вы можете получить позицию первого элемента, добавив onGloballyPositioned https://developer.android.com/reference/kotlin/androidx/compose/ui/layout/OnGloballyPositionedModifier к модификатору первого элемента.

Он возвращает:

  • исходное положение после создания макета
  • обновленная позиция каждый раз во время события прокрутки

В LayoutCoordinates объект внутри лямбды позволяет получить:

  • positionInParent()
  • positionInRoot()
  • positionInWindow()

Чтобы получить x или y из LazyColumn/ LazyRow вы можете использовать эту часть кода:

              val initialLayoutY: MutableState<Float?> = rememberSaveable { mutableStateOf(null) }
        Text(
            text = "Lorem",
            modifier = Modifier.onGloballyPositioned { layoutCoordinates ->
                if (initialLayoutY.value == null) {
                    initialLayoutY.value = layoutCoordinates.positionInRoot().y
                }

                val currentTextLayoutY: Float = layoutCoordinates.positionInRoot().y
                val currentLazyListY: Float = initialLayoutY.value!! - currentTextLayoutY
                Log.e("Lazy Column y", currentLazyListY.toString())
            }
        )

К сожалению, при быстрой прокрутке пропускается много значений. Вот результат:

Это не совсем так <tcode id="22867114"></tcode>.

С 1.0.0-beta02 вы можете использовать <strong> <tcode id="22867116"></tcode></strong> чтобы проверить, прокручивается ли список в данный момент жестом, щелчком или программно или нет.

      val itemsList = (0..55).toList()
val state = rememberLazyListState()

if (state.isScrollInProgress){
    //....
}

LazyColumn(state = state) {
    items(itemsList) {
        Text(".....")
    }
}

Это должно быть то, что вы хотите:

          val scrollCallback = object : ScrollCallback {
    override fun onCancel() {
        super.onCancel()
    }

    override fun onScroll(scrollDistance: Float): Float {
        return super.onScroll(scrollDistance)
    }

    override fun onStart(downPosition: Offset) {
        super.onStart(downPosition)
    }

    override fun onStop(velocity: Float) {
        super.onStop(velocity)
    }
}
LazyColumnFor(
    modifier = Modifier.scrollGestureFilter(scrollCallback, Orientation.Vertical),
    items = listOf("")
) { item ->

}
Другие вопросы по тегам