Search code examples
react-nativescrollreact-native-flatlistflatlist

How to scroll To next item on a button click using FlatList in React Native?


I have an array of months which I am using to display months using a horizontal FlatList. I want the months to change using 2 buttons that are forward button to change the month in increasing order i.e from January to February and so on and a back button to change the month backwards i.e from January to December.

enter image description here How can I make the buttons do so. Below monthName is an array that contains all the month names.

<ScrollView style={{flexGrow: 1}}>
      <View style={{flex: 1, backgroundColor: '#fff', height: hp('130')}}>
          <View
            style={{
justifyContent: 'space-evenly',
          width: wp('48'),
        }}>
        <FlatList
          data={monthName}
          pagingEnabled={true}
          showsHorizontalScrollIndicator={false}
          renderItem={(month, index) => (
            <View>
              <Months
                showMonth={month.item}
                id={month.id}
                refer={flatRef}
              />
            </View>
          )}
          keyExtractor={(item, index) => item.id.toString()}
          horizontal
          // snapToInterval={Dimensions.get('window').width}
          snapToAlignment={'center'}
          ref={(node) => (flatRef = node)}
        />
      </View>

      <View
        style={{
          justifyContent: 'space-evenly',
          width: wp('12'),
        }}>
        {/* {} */}
        <IonIcons.Button  --> the button that makes the month increment.
          name="arrow-forward"
          size={25}
          backgroundColor="white"
          color="black"
          // onPress={() => console.log('pressed')}
          onPress={() => {
            flatRef.scrollToIndex({index: ?});
          }}
        />
      </View>
</View>

</ScrollView>

Solution

  • Instead of using a FlatList I would suggest you to make a state variable and execute it like this

    Working example - Here

    import * as React from 'react';
    import { Text, View, StyleSheet } from 'react-native';
    import { AntDesign } from '@expo/vector-icons';
    
    ...
    
      const [SelectMonth, SetSelectMonth] = React.useState(monthName[0]);
    
      const NextPress = () => {
        if (SelectMonth.id !== 12) {
          let temp = monthName.find((c) => c.id === SelectMonth.id + 1);
          if (temp) {
            SetSelectMonth(temp);
          }
        }
      };
    
      const PrevPress = () => {
        if (SelectMonth.id !== 1) {
          let temp = monthName.find((c) => c.id === SelectMonth.id - 1);
          if (temp) {
            SetSelectMonth(temp);
          }
        }
      };
    
      return (
        <View style={styles.container}>
          <View style={styles.CalenderBox}>
            <AntDesign
              name="caretleft"
              size={30}
              color="black"
              onPress={() => PrevPress()}
            />
    
            <View style={styles.MonthNameBox}>
              <Text style={{ fontWeight: 'bold', fontSize: 24 }}>
                {SelectMonth.name}
              </Text>
            </View>
    
            <AntDesign
              name="caretright"
              size={30}
              color="black"
              onPress={() => NextPress()}
            />
          </View>
        </View>
      );