11

我在屏幕顶部显示了按钮(使用react-native-scrollable-tab-view)。在按钮下方,我有ListView部分标题。

当我滚动时,有没有办法让标题粘在标签视图的底部边缘?

我很难让ListView's section header 粘在 Facebook TabBar 的底部,它的默认设置是粘在屏幕的顶部。

当我滚动时,部分标题会在标签栏下方滑动。

对此有什么想法吗?我应该在 FacebookTabBar.js 中更改什么以使其正常工作吗?

顶部没有标签栏

诺巴

顶部有标签栏

注意:奇怪的是这个 GIF 没有正确显示完整的动画;您可以想象列表滚动了很多,并且部分标题在选项卡栏下滑动。

带杆

节标题样式

catListHeaderContainer: {
    padding: 12,
    backgroundColor: '#1F2036',
}

FacebookTabBar 样式

var styles = StyleSheet.create({
  tab: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    paddingBottom: 10,
  },

  tabs: {
    height: 60,
    flexDirection: 'row',
    paddingTop: 5,
    borderWidth: 0,
    borderTopWidth: 0,
    borderLeftWidth: 0,
    borderRightWidth: 0,
    borderBottomColor: 'rgba(0,0,0,0)',
  },

  activeTabTitle: {
    marginTop: 40,
    color: '#3B5998',
  },

  nonActiveTabTitle: {
    marginTop: 40,
    color: '#BDBDBD',
  },

});
4

2 回答 2

21

ListView Headers 不粘,您需要使用renderSectionHeaderandcloneWithRowsAndSections而不是cloneWithRows这样做。

来自ListView 上的 React Native文档

renderSectionHeader function 

(sectionData, sectionID) => renderable

If provided, a sticky header is rendered for this section. The sticky behavior means that it will scroll with the content at the top of the section until it reaches the top of the screen, at which point it will stick to the top until it is pushed off the screen by the next section header.

我今天解决了同样的问题。以下是我的处理方式。首先,在getInitialState

getInitialState: function() {

  return {
    dataBlob: {},
    dataSource: new ListView.DataSource({
    rowHasChanged: (r1, r2) => r1 !== r2,
    sectionHeaderHasChanged: (s1, s2) => s1 !== s2
    }),
  }
},

然后,在获取数据的 API 调用期间,我将该响应数据添加到我的dataBlob对象中。存储它的密钥被认为是sectionIdfor ListView.DataSource。在这种情况下,这sectionId将是我检索到的帖子的日期:

  getAllPosts: function() {

    api.getAllPosts()
      .then((responseData) => {
        var tempDataBlob = this.state.dataBlob;
        var date = new Date(responseData.posts[0].day).toDateString();
        tempDataBlob[date] = responseData.posts;
        this.setState({
          dataBlob: tempDataBlob
        });
        ;
      }).then(() => {
        this.setState({
          dataSource: this.state.dataSource.cloneWithRowsAndSections(this.state.dataBlob),
          loaded: true
        })
      })
      .done();
  },

cloneWithRowsAndSections接受 a dataBlob(在我的例子中,一个对象)作为它的第一个参数,以及 and 的可选sectionIDs参数rowIDs

外观如下renderListView

  renderListView: function() {
    return (
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderPostCell}
        renderSectionHeader={this.renderSectionHeader}
        renderFooter={this.renderFooter}
        onEndReached={() => {this.getAllPosts(this.state.currentDay)}}
        onEndReachedThreshold={40}
        style={styles.postsListView} />
      )
  },

renderSectionHeader外观如下:

  renderSectionHeader: function(sectionData, sectionID) {
    return (
      <View style={styles.section}>
        <Text style={styles.sectionText}>{sectionID}</Text>
      </View>
      )
  },

这是它最终的样子: 图片

于 2015-06-26T08:53:53.207 回答
2

现在,如果您查看此代码,您可能会注意到它CategoryScrollView(带有 的标签tabTitle='Search')的直接子代。

我做这项工作的尝试是让View成为.ScrollViewCategoryView

<ScrollView tabTitle='Search' tabLabel="ion|ios-search" style={styles.tabView}>
  <View style={styles.categoryContain}>
    <Category/>
  </View>
</ScrollView>

View然后我按以下方式进行样式设置:

categoryContain: {
  top: 0,
  height: deviceHeight,
},

这似乎部分解决了问题。部分原因是,例如,如果我单击单元格 2然后向上拉列表,列表视图会正确滚动,并且部分标题会以我期望的方式粘贴。

但是,如果我最初单击(连续按住鼠标按钮)并下拉列表,然后尝试将其拉起,列表及其部分标题会滑到选项卡栏后面,从而显示原始行为,这不是我想看。

拉起名单

在此处输入图像描述

最初拉下,然后拉上列表

在此处输入图像描述

于 2015-06-29T00:53:30.697 回答