Как заставить заголовок раздела ListView придерживаться

У меня есть кнопки, отображаемые в верхней части экрана (используется react-native-scrollable-tab-view). Под кнопками у меня есть ListView с заголовком раздела.

Есть ли способ заставить заголовок прилипать к нижнему краю вкладки при прокрутке?

Мне было трудно заставить заголовок раздела ListView прилипнуть к нижней части панели вкладок Facebook, и по умолчанию он прикрепляется к верхней части экрана.

Когда я прокручиваю, заголовок раздела скользит под панелью вкладок.

Есть мысли по этому поводу? Есть ли что-то, что я должен изменить в FacebookTabBar.js, чтобы это заработало?

Без панели вкладок вверху

nobar

С панелью вкладок вверху

Примечание. Странно, что этот GIF не показывает всю анимацию правильно; вы можете себе представить, что список сильно прокручивается, а заголовок раздела скользит под панелью вкладок.

withbar

Стили заголовков разделов

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

Стили панели вкладок Facebook

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',
  },

});

person Ji Park    schedule 26.06.2015    source источник


Ответы (2)


Заголовки ListView не прилипают, для этого вам нужно использовать renderSectionHeader и cloneWithRowsAndSections вместо cloneWithRows.

Из документации React Native по ListView

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. Ключ, в котором он хранится, считается sectionId для 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 принимает dataBlob (в моем случае объект) в качестве первого аргумента и необязательные аргументы 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>
      )
  },

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

person Richard Kho    schedule 26.06.2015
comment
Спасибо, Ричард, теперь я использую cloneWithRowsAndSections. Заголовок раздела правильно прилипает к верхней части экрана. Сейчас я изучаю, как заставить заголовок раздела придерживаться определенного расстояния от вершины. Я отредактировал свой исходный пост, чтобы уточнить, что я имею в виду. Похоже, мне, возможно, придется найти часть кода, которая сообщает заголовку раздела, чтобы он придерживался верхней части, возможно, это даст мне больше информации о том, как приступить к тому, чтобы заголовок оставался в другом месте вдали от вершины. - person Ji Park; 28.06.2015
comment
Не могли бы вы показать мне стиль, который у вас есть для панели навигации/вкладок и заголовка раздела? - person Richard Kho; 28.06.2015
comment
Спасибо за ответ, Ричард, я обновил исходный пост со стилями. Также я разместил здесь код ListView, FacebookTabBar и Index: a> gist.github.com/jhprks/661907acde4943eae3a6 gist.github.com/jhprks/8117845dd59da9095265 - person Ji Park; 29.06.2015
comment
Я думаю, что я немного ближе к тому, чтобы сделать эту работу. Пожалуйста, смотрите мои выводы ниже. - person Ji Park; 29.06.2015
comment
Спасибо, Ричард, оказалось, что решение было прямо у меня под носом. Я обновил этот пост своим собственным ответом, как показано ниже. - person Ji Park; 01.07.2015
comment
Фантастика, приятно слышать! - person Richard Kho; 01.07.2015
comment
Я думаю, что липкие заголовки еще не поддерживаются на Android. - person Janaka Pushpakumara; 09.11.2016

Прямо сейчас, если вы посмотрите на этот код, вы можете заметить, что Category является прямым потомком из ScrollView (тег с tabTitle='Search').

Моя попытка выполнить эту работу состояла в том, чтобы позволить View быть прямым дочерним элементом ScrollView и записать Category как дочерний элемент View.

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

Затем я стилизовал View следующим образом:

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

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

Однако, если я сначала щелкну (непрерывно удерживая нажатой кнопку мыши) и потяну список вниз, а затем попытаюсь вытащить его после этого, список и его заголовок раздела сместятся за панель вкладок, таким образом показывая исходное поведение, которое не то, что я хотеть увидеть.

Вытягивание списка

введите здесь описание изображения

Сначала опустить, а затем открыть список

введите здесь описание изображения

person Ji Park    schedule 29.06.2015
comment
В дополнение к изменениям, которые я сделал, как показано в этом посте, добавление scrollEnabled={false} в ScrollView устранило проблему. - person Ji Park; 01.07.2015