RN FlatList中的两列

时间:2018-01-18 20:59:49

标签: react-native react-native-flatlist

如何在React Native Flatlist中列出2列,例如:

enter image description here

6 个答案:

答案 0 :(得分:7)

将prop numColumns传递给FlatList组件。

答案 1 :(得分:2)

您可以通过以下两种方式之一来完成。首先,直接的方法是使用flex布局创建2个FlatList列,并在它们之间分配数据:

假设您已定义styledata

const style={
  container: {
    flex: 1,
    flexDirection: 'row',
    height: 400
  },
  column: {
    flex: 1,
    flexDirection: 'column'
  },
  row: {
    flexDirection: 'row'
  },
  item: {
    flex: 1
  }
}

const data = [
  { key: 'A' },
  { key: 'B' },
  { key: 'C' },
  { key: 'D' },
  { key: 'E' },
  { key: 'F' },
  { key: 'G' },
  { key: 'H' },
  { key: 'I' }
];

你可以这样做

render() {
  //Split the data (however you want it)
  const column1Data = data.filter((item, i) => i%2 === 0);
  const column2Data = data.filter((item, i) => i%2 === 1);

  return (
    <View style={ style.container }>

      <View style={ style.column }>
        <Text>Column 1</Text>
        <FlatList
          data={ column1Data }
          renderItem={ ({ item }) => (
            <View style={ style.item }>
              <Text>{ item.key }</Text>
            </View>
          ) }
        />
      </View>

      <View style={ style.column }>
        <Text>Column 2</Text>
        <FlatList
          data={ column2Data }
          renderItem={ ({ item }) => (
            <View style={ style.item }>
              <Text>{ item.key }</Text>
            </View>
          ) }
        />
      </View>

    </View>
  );
}

问题,两个列表都是独立的,会导致糟糕的移动体验。更好的方法是对数据进行分组并呈现单个列FlatList,以便您的内容统一。

首先您需要一个功能将数据分组为“行”数据

  //The key here is grouping the data to be in one row together
  const groupData = (items, groupLen) => {
    const groups = [];
    let i = 0;

    while (i < items.length) {
      groups.push(items.slice(i, i += groupLen));
    }

    return groups;
  };

然后这样做......

render() {
  const groupedItems = groupData(data, 2)

  return (
    <View style={ style.column }>

        <Text>Main Column</Text>
        <FlatList
          data={ groupedItems }
          renderItem={ ({ item }) => (
            <View style={ style.row }>
              {
                /* item is really the group of items in the row */
                item.map((singleItem, index ) => (
                  <Text style={ style.item }>{ singleItem.key }</Text>
                ))
              }
            </View>
          ) }
        />

    </View>
  );
}

您可能需要摆弄样式以获得您想要的样式,但您明白了这一点:)

答案 2 :(得分:0)

react-native标准样式为flexDirection: 'col',表示元素从上到下排列。要更改此项(从右到左),您应将样式设置为flexDirection: 'row'

<View style={{flexDirection: 'row'}}>
  <FlatList
    data={[{key: 'a'}, {key: 'b'}]}
    renderItem={({item}) => <Text>{item.key}</Text>}
  />
  <FlatList
    data={[{key: 'a'}, {key: 'b'}]}
    renderItem={({item}) => <Text>{item.key}</Text>}
  />
</View>

答案 3 :(得分:0)

我花了很长时间才弄清楚这一点,但是实际上可以在不使用任何外部库的情况下实现。您将需要以明智的方式使用负边距。

负边距将应用于VirtualizedList属性CellRendererComponent中,以使其在Android上正常工作。

JSX:

<View style={styles.container}>
      <FlatList
        style={styles.flatlist}
        data={data}
        keyExtractor={(item, index) => index.toString()}
        CellRendererComponent={({ children, item, ...props }) => {
            return (
                <View {...props} style={{ marginTop: item.marginTop }}>
                    {children}
                </View>
            )
        }}
        renderItem={({ item }) => {
            const { source: source1, height: height1, marginTop: marginTop1 } = item.image1;
            const { source: source2, height: height2, marginTop: marginTop2 } = item.image2;
            return (
                <View style={Style.viewRow}>
                    <Image source={source1} style={[styles.image, { height: height1, marginTop: marginTop1 }]} />
                    <Image source={source2} style={[styles.image, { height: height2, marginTop: marginTop2 }]} />
                </View>
            )
        }}
    />
</View>

数据:

const source = { uri: 'https://placekitten.com/160/300' };

const data = [
    {
        marginTop: 0,
        image1: { source, height: 300, marginTop: 0 },
        image2: { source, height: 250, marginTop: 0 }
    },
    {
        marginTop: -50,
        image1: { source, height: 290, marginTop: 50 },
        image2: { source, height: 300, marginTop: 0 }
    },
    {
        marginTop: -40,
        image1: { source, height: 250, marginTop: 40 },
        image2: { source, height: 350, marginTop: 0 }
    }
];

样式:

const styles = StyleSheet.create({
   container: {
      flex: 1
   },
   flatList: {
      width: '100%',
      height: '100%'
   },
   viewRow: {
      flexDirection: 'row'
   },
   image: {
      width: '50%',
      resizeMode: 'cover'
   }
});

请注意,适当地将图像排列在阵列中取决于您-始终将较高的图像放在较短的一侧,并确保计算出高度差并对其进行跟踪。玩得开心。

答案 4 :(得分:0)

通过numColumns

<FlatList 
 data={albums}
 renderItem={({item}) => <></>}
 numColumns={2}
/>

答案 5 :(得分:0)

您可以尝试使用react-native-scroll-lazy而不是ScrollView,以前我遇到过上述问题,我已经解决了这些问题,并编写了一个库以与遇到相同问题的人共享。