次のような単一のListView
コンポーネント内に3つの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
の表示をトリガーします。
問題は、onEndReached={() => alert('load more 1')}
を含むListView
がアラートを実行しないため、下にスクロールしてリストビューの最後に到達しても、それ以上ロードできないことです。折り返しScrollView
を削除するとアラートが実行されますが、折り返しHeader
を削除したため、一般的なScrollView
はスクロールしません。ヘッダーはリストビューでスクロールする必要があるため、スクロールする必要があるすべてのものをScrollView
でラップしました。
重要な注意:このシナリオでは、ListView
を_renderHeader={this.header}
_と一緒に使用することはできません。なぜなら、Header
はスクロールしますが、Header
がレンダリングされるたびに、共通のListView
と各ListView
の3つのタブが再レンダリングされるからです。一度。したがって、Header
ごとに毎回新しいListView
を再レンダリングしても、アプリではカットされません。
この問題の解決策を探しています。ここでは、Header
がリストビューとともにスクロールし、onEndReached
が表示されているListView
に対してトリガーされます。
3つの異なるListViewをロードする代わりに、選択されたヘッダー要素に応じて各listViewのdataSourceを変更することで、これを解決する必要があると思います。
getInitialState() {
return {
currentList: this.ds.cloneWithRowsAndSections(INITIAL_DATA);
}
},
render() {
return <ListView renderHeader={this._renderHeader} dataSource={this.state.currentList}/>
}
これを実行したくない唯一の理由は、3つのサブリストビューでスクロール位置を維持したい場合ですが、探しているリストビューを変更するには常に一番上にスクロールする必要があるため、これは役に立ちません。とにかく。
次に、あなたの_renderHeader
関数は、選択したヘッダーに応じてcurrentList
に異なるデータを入力するセレクターをレンダリングします。
スタイリングでは、top: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で機能する可能性のある2番目のオプションは、3つすべてのListViewの高さを指定することです。
ScrollView::onScroll
を使用することもできますが、少しハッキーになります。リストビューのサイズを知る必要があります。
おそらく最善の解決策は、ListView
dataSourceとonEndReached
関数で遊ぶことでしょう。
ListView::onEndReached
がトリガーされたときにデータセットを更新すると、ListViewに要素を追加できると思います。このように、ScrollViewsのListViewsでハッキーなことをする必要はありません。