具有动态行和列的 react-native flatlist
react-native flatlist with dynamic rows and columns
我正尝试在 react-native 应用程序中使用 FlatList 构建一个简单的布局,如下所示:
example-image。我需要根据项目的索引创建一个动态布局,所以如果索引 ===0 第一张图像应该是宽的并且下面的列应该是连续的 2 个较小的图像,这是我的代码。
根据这个逻辑,我可以将第一个图像显示为宽图像,但其余图像显示不正确,我得到这样的结果 current layout宽图像下方的较小图像有一个空 space 接下来对它来说,如果我改变 index === 5 同样的事情发生,宽图像下方的列有一个点,另一个较小的图像应该在这个位置。我不知道为什么会发生这种情况以及如何解决它,我也在这里阅读了其他帖子。非常感谢任何建议和帮助。
<FlatList
showsVerticalScrollIndicator={false}
contentContainerStyle={{
alignSelf: 'center',
alignItems: 'center',
}}
columnWrapperStyle={{flexWrap: 'wrap'}}
data={layoutData}
renderItem={({item, index}) =>
index === 0 ? (
<TouchableOpacity
style={styles.container}
<Image
style={styles.wideImg}
/>
</TouchableOpacity>
) : (
<TouchableOpacity
style={styles.container}
<Image
style={styles.img}
/>
</TouchableOpacity>
)
}
numColumns={2}
/>
因为你设置了numColumns
={2},这使得FlatList
每两个项目渲染成一行。第一个大项目和第二个项目在同一行,第三个项目和第四个项目在新行中。所以第二项旁边会有一个位置。您可以将 numColumns
的长度设置为 layoutData
而不是 2
.
<FlatList
showsVerticalScrollIndicator={false}
contentContainerStyle={{
alignSelf: 'center',
alignItems: 'center',
}}
columnWrapperStyle={{flexWrap: 'wrap'}}
data={layoutData}
renderItem={({item, index}) =>
index === 0 ? (
<TouchableOpacity
style={[styles.container, { width: '100%', height: 50, borderColor: 'white', borderWidth: 1 }]}
>
{/* <Image
style={styles.wideImg}
/> */}
</TouchableOpacity>
) : (
<TouchableOpacity
style={[styles.container, { width: '50%', height: 50, borderColor: 'white', borderWidth: 1 }]}
>
{/* <Image
style={styles.img}
/> */}
</TouchableOpacity>
)
}
numColumns={layoutData.length}
/>
我正尝试在 react-native 应用程序中使用 FlatList 构建一个简单的布局,如下所示: example-image。我需要根据项目的索引创建一个动态布局,所以如果索引 ===0 第一张图像应该是宽的并且下面的列应该是连续的 2 个较小的图像,这是我的代码。
根据这个逻辑,我可以将第一个图像显示为宽图像,但其余图像显示不正确,我得到这样的结果 current layout宽图像下方的较小图像有一个空 space 接下来对它来说,如果我改变 index === 5 同样的事情发生,宽图像下方的列有一个点,另一个较小的图像应该在这个位置。我不知道为什么会发生这种情况以及如何解决它,我也在这里阅读了其他帖子。非常感谢任何建议和帮助。
<FlatList
showsVerticalScrollIndicator={false}
contentContainerStyle={{
alignSelf: 'center',
alignItems: 'center',
}}
columnWrapperStyle={{flexWrap: 'wrap'}}
data={layoutData}
renderItem={({item, index}) =>
index === 0 ? (
<TouchableOpacity
style={styles.container}
<Image
style={styles.wideImg}
/>
</TouchableOpacity>
) : (
<TouchableOpacity
style={styles.container}
<Image
style={styles.img}
/>
</TouchableOpacity>
)
}
numColumns={2}
/>
因为你设置了numColumns
={2},这使得FlatList
每两个项目渲染成一行。第一个大项目和第二个项目在同一行,第三个项目和第四个项目在新行中。所以第二项旁边会有一个位置。您可以将 numColumns
的长度设置为 layoutData
而不是 2
.
<FlatList
showsVerticalScrollIndicator={false}
contentContainerStyle={{
alignSelf: 'center',
alignItems: 'center',
}}
columnWrapperStyle={{flexWrap: 'wrap'}}
data={layoutData}
renderItem={({item, index}) =>
index === 0 ? (
<TouchableOpacity
style={[styles.container, { width: '100%', height: 50, borderColor: 'white', borderWidth: 1 }]}
>
{/* <Image
style={styles.wideImg}
/> */}
</TouchableOpacity>
) : (
<TouchableOpacity
style={[styles.container, { width: '50%', height: 50, borderColor: 'white', borderWidth: 1 }]}
>
{/* <Image
style={styles.img}
/> */}
</TouchableOpacity>
)
}
numColumns={layoutData.length}
/>