0

"FlatList не прокручивается"

15

Описание проблемы:

Я создал экран, на котором отображается компонент, содержащий FlatList. По какой-то причине я не могу прокручивать список. Можете ли вы помочь мне обнаружить ошибку и указать направление для решения?

render-функция и стили из моего экранного файла:

render() {
  return (
    <View style={styles.container}>
      <SearchBar />
      <ActivityList style={styles.list} data={this.state.data} />
    </View>
  );
}
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    overflow: 'hidden',
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'flex-start',
  },
  list: {
    flex: 1,
    overflow: 'hidden',
  },
});

render-функция и стили из моего компонента списка элементов:

export default class CardItem extends React.PureComponent {
  render() {
    return (
      <View style={styles.cardview}>
        <View style={styles.imagecontainer}>
          <Image
            resizeMode="cover"
            style={styles.cardimage}
            source={{
              uri: this.props.image,
            }}
          />
        </View>
        <View style={styles.cardinfo}>
          <Text style={styles.cardtitle}>{this.props.title}</Text>
          <View style={styles.cardtext}>
            <Text style={styles.textdate}>{this.props.date}</Text>
            <Text style={styles.texthour}>{this.props.hour}</Text>
          </View>
        </View>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  cardview: {
    flex: 1,
    justifyContent: 'flex-start',
    backgroundColor: 'white',
    elevation: 3,
    maxHeight: 200,
    width: Dimensions.get('window').width - 20,
    margin: 1,
    marginTop: 10,
    borderRadius: 4,
  },
  imagecontainer: {
    flex: 7,
    height: 140,
    borderRadius: 4,
  },
  cardimage: {
    flex: 1,
    opacity: 0.8,
    height: 140,
    borderTopLeftRadius: 4,
    borderTopRightRadius: 4,
  },
  cardinfo: {
    flex: 2,
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
    padding: 10,
  },
  cardtitle: {
    flex: 1,
    fontSize: 16,
    fontWeight: 'bold',
  },
  cardtext: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'flex-end',
  },
  textdate: {
    color: '#5e5e71',
  },
  texthour: {
    color: '#5e5e71',
  },
});

render-функция и стили из моего компонента списка:

export default class ActivityList extends React.Component {
  _renderCardItem = ({ item }) => (
    <CardItem
      image={item.image}
      title={item.title}
      date={item.date}
      hour={item.hour}
    />
  );

  _keyExtractor = item => item.id;

  render() {
    return (
      <FlatList
        data={this.props.data}
        renderItem={this._renderCardItem}
        contentContainerStyle={styles.cardcontainer}
        keyExtractor={this._keyExtractor}
      />
    );
  }
}

const styles = StyleSheet.create({
  cardcontainer: {
    flex: 1,
    overflow: 'hidden',
    backgroundColor: 'white',
    alignItems: 'center',
    width: Dimensions.get('window').width,
    borderWidth: 0,
  },
});

Мои данные имеют уникальные идентификаторы, заголовки, даты и часы.

Я просмотрел все доступные руководства и документацию, но не нашел решения.

5 ответ(ов)

1

Уберите flex: 1 из вашего styles.cardcontainer, это должно решить проблему с прокруткой. Свойство contentContainerStyle в FlatList/ScrollView оборачивает все дочерние компоненты — это то, что находится внутри FlatList, и у него не должно быть заданной высоты или значения flex. Если вам нужно установить flex: 1 для самого FlatList, используйте style={{flex: 1}} вместо этого. Удачи!

0

Вы столкнулись с аналогичной проблемой при использовании FlatList? Попробуйте использовать стили flex: 1 и flexGrow: 1 для вашего компонента FlatList. Вот пример кода:

<View style={styles.list}>
  <FlatList style={{ flex: 1, flexGrow: 1 }} />
</View>

Эти стили помогут FlatList правильно занять доступное пространство в родительском представлении. Это решение сработало для меня. Надеюсь, что поможет и вам!

0

Я тоже сталкивался с этой проблемой, когда добавлял инструмент для работы с изображениями в своем приложении для чата, и нашел обманное решение.

Просто добавив TouchableWithoutFeedback, который оборачивает каждый элемент в FlatList, я смог преодолеть эту проблему. Странно, но это работает.

Вот как это выглядит в коде:

_renderCardItem = ({ item }) => (
  <TouchableWithoutFeedback onPress={() => {}}>
    <CardItem
      image={item.image}
      title={item.title}
      date={item.date}
      hour={item.hour}
    />
  </TouchableWithoutFeedback>
);

Попробуйте, возможно, это поможет и вам!

0

Для того чтобы обеспечить прокрутку FlatList, выполните следующие шаги:

<View style={{flex: 1}}>
  <FlatList
    data={this.state.data}
    renderItem={({item}) => this.renderData(item)}
    keyExtractor={item => item._id}
    contentContainerStyle={{
      flexGrow: 1,
    }}
  />
</View>

Этот код оборачивает FlatList в View с flex: 1, что позволяет ему занимать всю доступную высоту. Используя contentContainerStyle с flexGrow: 1, вы обеспечиваете, что контент внутри FlatList может растягиваться, позволяя ему прокручиваться, если данных больше, чем помещается на экране.

0

Для остальных, кто столкнется с этой проблемой: мой FlatList находился внутри TouchableWithoutFeedback. Я заменил его на View, и снова смог прокручивать список.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь