React Native - разбиение списков списков в ScrollView?
У меня есть 3 ListView
компонента внутри одного компонента ScrollView
, как это:
<ScrollView>
<Header />
<ListView onEndReached={() => alert('load more 1')}/>
<ListView onEndReached={() => alert('load more 2')}/>
<ListView onEndReached={() => alert('load more 3')}/>
<Footer />
</ScrollView>
Компонент Header
имеет некоторое общее содержимое, а также имеет 3 вкладки, которые запускают отображение соответствующего ListView
Проблема заключается в любом ListView
с onEndReached={() => alert('load more 1')}
никогда не запускает предупреждение, поэтому я никогда не могу загружать больше, когда я прокручиваю вниз и попадаю в конец списка. Удалите обертку ScrollView
и запускается предупреждение, но общий Header
не прокручивается, так как мы просто удалили упаковку ScrollView
. Заголовок должен прокручиваться списком, поэтому я завернул все, что нужно прокрутить в ScrollView
.
ВАЖНОЕ ПРИМЕЧАНИЕ:
Я не могу использовать ListView
с renderHeader={this.header}
для этого сценария. Поскольку, несмотря на то, что Header
будет прокручиваться, он будет ретранслировать общие Header
и 3 вкладки для каждого ListView
каждый раз, когда ListView
отображает вместо одного. Таким образом, новый Header
reerender каждый раз для каждого ListView
не будет вырезать его для приложения.
Ищете решение этой проблемы, где прокручиваются прокрутки Header
со списками и onEndReached
для видимого ListView
.
Ответы
Ответ 1
Я думаю, вам придется решить эту проблему, изменив dataSource в каждом listView в ответ на какой элемент заголовка выбран вместо загрузки трех разных ListView.
getInitialState() {
return {
currentList: this.ds.cloneWithRowsAndSections(INITIAL_DATA);
}
},
render() {
return <ListView renderHeader={this._renderHeader} dataSource={this.state.currentList}/>
}
Единственная причина, по которой вы не хотели бы этого делать, - это сохранить позицию прокрутки в трех списках ListView, но это не будет полезно, потому что вам всегда нужно прокручивать вверх, чтобы изменить, какой ListView вы Во всяком случае, смотрим.
Затем в вашей функции _renderHeader
вы будете отображать селектор, который заполняет currentList
разными данными в зависимости от выбранного заголовка.
Ответ 2
В стилистике вы можете установить его положение как относительное с верхним: 0 и left: 0. Таким образом, он останется неподвижным сверху.
<View>
<Header style={{position:"relative",top:0,left:0,height:30,width:Dimensions.get("window").width}} />
<ListView />
<ListView />
<ListView />
<Footer />
</View>
Второй параметр, который может работать в scrollview, - это указать высоту для всех трех ListView.
Ответ 3
Вы можете использовать ScrollView::onScroll
, но он будет немного взломан. Вам нужно будет узнать размер ваших списков.
Работа только с ListView
Возможно, лучшим решением будет играть с ListView
dataSource и onEndReached
.
Если вы обновите свой набор данных при срабатывании ListView::onEndReached
, я думаю, вы можете добавить в свой список больше элементов. Таким образом, вам не нужно делать хакерские вещи с помощью ListViews в ScrollViews.