Прокрутите до последнего элемента в FlatList — Android

#android #react-native #react-native-android #react-native-flatlist

#Android #реагировать-родной #react-native-android #реагировать-родной-flatlist

Вопрос:

Я реализую слайдер, используя FlatList — React Native,

У меня есть два случая

  • нажмите, чтобы перейти к следующему слайду
  • нажмите, чтобы пропустить и перейти к последнему элементу в слайдере

итак, сначала я должен знать текущий индекс, в котором я нахожусь, и на его основе я перехожу к следующему элементу,

и чтобы получить этот индекс, я должен использовать onMomentumScrollEnd , но проблема в том, что он не запускается в Android

    onMomentumScrollEnd={(ev) => {
          offsetRef.current = ev.nativeEvent.contentOffset.x;
          console.log('ev', ev.nativeEvent.contentOffset.x);
          console.log(' offsetRef.current', offsetRef.current);
    }}


const NextButton = () => {
  return (
    <TouchableOpacity
      onPress={() =>
        flatListRef.current.scrollToOffset({
          animated: true,
          offset: offset.current   width,
        })
      }>
      <Text style={{color: '#fff', fontSize: 16}}>Next</Text>
    </TouchableOpacity>
  );
};


const _renderSkipButton = () => {
    return (
      <AnimatedButton
        onPress={() => {
          // animation();
          // setDoneBtn((prev) => !prev);
          flatListRef.current.scrollToIndex({
            animated: true,
            index: data.length - 1, // Not work!
          });
        }}
        style={[styles.buttonCircle, {transform: [{translateY: skipButton}]}]}>
        <Text>skip</Text>
      </AnimatedButton>
    );
  };




 <Animated.FlatList
        data={data.reverse()}
        keyExtractor={(item) => item.title}
        horizontal
        ref={flatListRef}
        showsHorizontalScrollIndicator={false}
        pagingEnabled
        scrollEventThrottle={16}
        contentContainerStyle={{
          paddingBottom: 100,
          flexDirection: 'row-reverse',
        }}
        onScroll={Animated.event(
          [{nativeEvent: {contentOffset: {x: scrollX}}}],
          {useNativeDriver: false},
        )}
        onMomentumScrollEnd={(ev) => {
          const index = Math.round(ev.nativeEvent.contentOffset.x / ITEM_WIDTH);
          const newIndex = I18nManager.isRTL ? data.length - index - 1 : index;
          indexItem.current = newIndex;
          console.log('onMomentumScrollEnd', newIndex);
        }}
        renderItem={....}
       />
 

ЖИВЫЕ КОНЦЕРТЫ

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

1. Почему вы используете смещение для предыдущего / следующего и индекс для пропуска?

2. @J.Doe для пропуска я перехожу к последнему индексу, который будет работать (я собираюсь индексировать 0), потому что мое приложение RTL, для следующего предыдущего я просто пытаюсь индексировать и смещать, но ничего не работает, как ожидалось!

Ответ №1:

onMomentumScrollEnd вызывается, когда вы проводите пальцем, я думаю, вам нужно управлять этим вручную.

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

1. Не совсем, приведенный выше код хорошо работает в iOS, я думаю, это ошибка, в следующей кнопке я прокручиваю до смещения, основанного на текущем смещении FlatList, но поскольку onMomentumScrollEnd он не сработал, я не смог получить новое смещение, и поэтому следующая кнопка не работает и застряла на втором слайде 🙂