Вкатывается в LazyColumnFor (Jetpack Compose)

#android #android-jetpack-compose #android-jetpack-compose-list

#Android #android-jetpack-compose #android-jetpack-compose-list

Вопрос:

Кто-нибудь нашел эквивалент onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) in LazyColumnFor ?

Ответ №1:

Вы можете получить позицию первого элемента, добавив 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())
            }
        )
 

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

Результат от функции onGloballyPositioned

Ответ №2:

Это не совсем onScrolled так .

С 1.0.0-beta02 помощью этого вы можете LazyListState#isScrollInProgress проверить, выполняется ли в данный момент прокрутка списка жестом, щелчком мыши или программно или нет.

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

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

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

Ответ №3:

с 1.0.0-alpha12 ним должно быть то, что вы хотите:

     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 ->

}
 

Комментарии:

1. Похоже, в какой-то момент это было удалено issuetracker.google.com/issues/175294473?pli=1