反应原始flatlist最后一项可见性问题

Muh*_*lha 16 react-native

我正在获取产品列表,然后使用平面列表显示,我的列表包含5个项目,因为您可以看到由于不同的描述文本,平面列表行高度是可变的.所以问题是我的最后一项卡片不完全可见,这可能是某种平面列表问题或布局问题.任何帮助将受到高度赞赏

 renderProducts() {
        if (this.props.loading === true) {
            return (
                <View style={Styles.spinnerStyle}>
                    <ActivityIndicator size='large' />
                </View>
            );
        }

        return (
                <FlatList
                    data={this.props.myProducts}
                    keyExtractor={(item) => item.id}
                    renderItem={({ item }) => (
                        <Card 
                            title={item.title} 
                            image={{ 
                                uri: item.image !== null ? item.image.src :'../resImage.jpg' 
                            }}
                        >
                            <Text style={{ marginBottom: 10 }}>
                                {item.body_html}
                            </Text>
                            <Button
                                icon={{ name: 'code' }}
                                backgroundColor='#03A9F4'
                                fontFamily='Lato'
                                buttonStyle={{ borderRadius: 0, marginLeft: 0, marginRight: 0, marginBottom: 0 }}
                                title='VIEW NOW' 
                            />
                      </Card>
                      )}
                />
        );
    }

    render() {
        return (
            <View>
                <View style={Styles.viewStyle}>
                    <Text style    {Styles.textStyle}>ProductsList</Text>
                </View>
                    { 
                        this.renderProducts() 
                    }
            </View>
        );
    }
Run Code Online (Sandbox Code Playgroud)

kri*_*ish 30

设置下边距

 <FlatList

 contentContainerStyle={{ paddingBottom: 20}}

 />
Run Code Online (Sandbox Code Playgroud)

  • 为什么我们必须这样做? (6认同)
  • 如果内容的_高度动态变化_,则此方法不起作用。要使 `FlatLIst` 的所有项目可见,请确保 __parent__ `View` 应具有 __固定高度或宽度__,具体取决于 FlatList 方向。 (3认同)
  • 它对我有用,我必须将 paddingBottom 设置为 350(通过反复试验)(我的平面列表项大小更高)。但是我们如何找到实际需要的填充 (2认同)

Ash*_*ish 29

将{flex:1}添加到包含Flatlist组件的View标记.

就我而言,

const App = () => {
  return (
    <Provider store={createStore(reducers)}>
    <View style={{ flex: 1 }}>
      <Header headerText={'My App'} />
      <ScreenTabs /> // this is my content with FlatList 
    </View>
    </Provider>
  );
};

export default App;
Run Code Online (Sandbox Code Playgroud)

  • 如果您的列表不可见,则可能是父视图不是 flex:1,您必须找到未扩展的父视图。 (6认同)
  • 当我这样做时,我的列表根本不再可见. (4认同)
  • `&lt;FlatList style={{flex: 1}}` 在没有任何父级 `&lt;View/&gt;` 的情况下也适用于我。不过,必须将 {flex: 1} 添加到主容器视图中。 (2认同)

Ami*_*mit 14

只需使用 flex:1 将其包装在视图中

<ParentView style={{flex:1}
    <View style={{flex:1}}>
    // Your flatlist
    <View>
</ParentView>
Run Code Online (Sandbox Code Playgroud)

另外,请注意,包含 Flatlist 的此“视图”的每个父级也必须是 Flex 为 1 的视图。否则,您的平面列表将不可见。

  • “另外,请注意,包装 Flatlist 的这个“视图”的每个父级也必须是 Flex 为 1 的视图。否则,您的 Flatlist 将不可见。” ....非常有用的评论!谢谢。 (2认同)

jam*_*mal 11

你可以试试这个解决方案

对于Vertical FlatList

<FlatList
 ListFooterComponent={<View />}
 ListFooterComponentStyle={{height:200}}
/>
Run Code Online (Sandbox Code Playgroud)

对于Horizontal FlatList

<FlatList
  contentContainerStyle={{paddingRight:40}}
/>
Run Code Online (Sandbox Code Playgroud)


jso*_*onp 9

@Christian(我无法发表评论,因为我的声誉太低)你无法看到你的列表与flex:1因为flex:1会将组件增加到父级.如果父级没有flex:1,则它不会伸展到其父级或屏幕.但请记住,使用SafeAreaView的flex:1将导致显示底部安全区域.如果您的SafeAreaView backgroundColor与列表的背景颜色不同,这将看起来很糟糕.

我的旧解决方法是在项目数组的底部添加一个项目,但我仍在探索如何使用FlatList滚动过去/在底部安全区域边缘下(这是我开始发布这篇文章的方式).

更新:使用ListFooterComponent,您甚至可以创建具有高度和/或边距的纯白色"页脚"

例如(如果我是你的话,我不会直接复制和粘贴这个...肯定有更好的方法来检测无边框的iPhone,特别是在2019年我们有多个时)

ListFooterComponent={<View style={{ height: 0, marginBottom: 90 }}></View>}
Run Code Online (Sandbox Code Playgroud)

我就是这样做的,现在使用iPhoneX的高度.但它不是面向未来的,因为每当没有挡板的新iPhone出现时,条件将需要更新:

ListFooterComponent={<View style={{ height: 0, marginBottom: noBezels ? 90 : 0 }}></View>}
Run Code Online (Sandbox Code Playgroud)

或者你可以在底部总是有一些间距,比如加载gif,消息......等等.

更新:

我发现了有一个hasNotch()方法的react-native-device-info.通过将hasNotch()与Platform.OS ==='ios'相结合,我发现对于没有挡板的iPhone造型非常有用

  • 嗨,@ jsonp,很不幸,我没有看到您的回复,但我基本上像您一样解决了它。我想感谢您的努力,尽管我无法及时阅读您的信息,但还是要感谢您。那谢谢啦!(也已投票) (2认同)

Flo*_*bre 9

对于 IOS 问题,您可以应用一些 IOS 特定的道具:

<FlatList
  // ...
  contentInset={{top: 0, bottom: 20, left: 0, right: 0}}
  contentInsetAdjustmentBehavior="automatic"
  // ...  
/>
Run Code Online (Sandbox Code Playgroud)

contentContainerStyle在我的案例中,带有填充的解决方案似乎并不是解决安全区域 IOS 问题的最佳整体。


小智 6

对我来说工作得很好

<FlatList
  data={data}
  contentContainerStyle={{ paddingBottom: 30 }}
  style={{height: '95%'}}
  renderItem={({ item, index }) => (
    <ListItem item={item} onPress={() => handlePress(item, index)} />
  )}
/>
Run Code Online (Sandbox Code Playgroud)


小智 5

使用FlatList的contentContainerStyle道具

<FlatList contentContainerStyle={{ paddingBottom: 20}} />
Run Code Online (Sandbox Code Playgroud)