React Native RefreshableListView (remobile)
A awesome pull-down-refresh and pull-up-loadmore listview
Installation
npm install @remobile/react-native-refresh-infinite-listview --save
Usage
Example
'use strict'; var React = require('react'); var ReactNative = require('react-native'); var { View, Text, StyleSheet, ListView } = ReactNative; var TimerMixin = require('react-timer-mixin'); var RefreshInfiniteListView = require('@remobile/react-native-refresh-infinite-listview'); var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); module.exports = React.createClass({ mixins: [TimerMixin], data: {index: 0, maxIndex:20, list:[]}, getData(init) { var total = 5; if (init) { this.data.index = 0; this.data.list = []; total = Math.floor(Math.random()*5); } for (var i=0; i<total; i++) { this.data.list[this.data.index] = "Row" + (this.data.index+1); this.data.index++; } }, getInitialState() { this.getData(true); return { dataSource: ds.cloneWithRows(this.data.list) } }, onRefresh() { this.getData(true); this.setTimeout(()=>{ this.list.hideHeader(); this.setState({dataSource: ds.cloneWithRows(this.data.list)}); }, 1000); }, onInfinite() { this.getData(); this.setTimeout(()=>{ this.list.hideFooter(); this.setState({dataSource: ds.cloneWithRows(this.data.list)}); }, 1000); }, loadedAllData() { return this.data.index >= this.data.maxIndex||this.data.index===0; }, renderRow(text) { return ( <View style={styles.row}> <Text > {text} </Text> </View> ) }, renderSeparator(sectionID, rowID) { return ( <View style={styles.separator} key={sectionID+rowID}/> ); }, render() { return ( <View style={{flex:1}}> <View style={{height:20}} /> <RefreshInfiniteListView ref = {(list) => {this.list= list}} dataSource={this.state.dataSource} renderRow={this.renderRow} renderSeparator={this.renderSeparator} loadedAllData={this.loadedAllData} initialListSize={30} scrollEventThrottle={10} style={{backgroundColor:'transparent'/*,top:100, left:10, width:200, height:300, position:'absolute'*/}} onRefresh = {this.onRefresh} onInfinite = {this.onInfinite} > </RefreshInfiniteListView> </View> ) } }); var styles = StyleSheet.create({ row: { height:60, flex: 1, flexDirection: 'row', alignItems: 'center', justifyContent: 'center' }, list: { alignSelf:'stretch' }, separator: { height: 1, backgroundColor: '#CCC' }, });
Screencasts
Props
footerHeight:number
if you need use infinite with custom, must set footerHeightpullDistance:number
set pull distance, default is 50renderEmptyRow:func
renderEmptyRow: () => { return ( <View style={{height:Dimensions.get('window').height, justifyContent:'center',alignItems:'center'}}> <Text style={{fontSize:40, fontWeight:'800', color:'red'}}> have no data </Text> </View> ) },
renderHeaderRefreshIdle:func
renderHeaderRefreshIdle: () => {return ( <View style={{flex:1, height:DEFAULT_HF_HEIGHT, justifyContent:'center', alignItems:'center'}}> <Text style={styles.text}> pull down refresh... </Text> <Image source={require('./pull_arrow.png')} resizeMode={Image.resizeMode.stretch} style={styles.image} /> </View> )},
renderHeaderWillRefresh:func
renderHeaderWillRefresh: () => {return ( <View style={{height:DEFAULT_HF_HEIGHT, justifyContent:'center', alignItems:'center'}}> <Text style={styles.text}> release to refresh... </Text> <Image source={require('./pull_arrow.png')} resizeMode={Image.resizeMode.stretch} style={[styles.image, styles.imageRotate]} /> </View> )},
renderHeaderRefreshing:func
renderHeaderRefreshing: () => {return ( <View style={{height:DEFAULT_HF_HEIGHT, justifyContent:'center', alignItems:'center'}}> <Text style={styles.text}> refreshing... </Text> <ActivityIndicatorIOS size='small' animating={true}/> </View> )},
renderHeaderRefreshing:func
renderFooterInifiteIdle: () => {return ( <View style={{height:DEFAULT_HF_HEIGHT, justifyContent:'center', alignItems:'center'}}> <Image source={require('./pull_arrow.png')} resizeMode={Image.resizeMode.stretch} style={[styles.image, styles.imageRotate]} /> <Text style={styles.text}> pull up to load more... </Text> </View> )},
renderFooterWillInifite:func
renderFooterWillInifite: () => {return ( <View style={{height:DEFAULT_HF_HEIGHT, justifyContent:'center', alignItems:'center'}}> <Image source={require('./pull_arrow.png')} resizeMode={Image.resizeMode.stretch} style={styles.image} /> <Text style={styles.text}> release to load more... </Text> </View> )},
renderFooterInifiting:func
renderFooterInifiting: () => {return ( <View style={{height:DEFAULT_HF_HEIGHT, justifyContent:'center', alignItems:'center'}}> <ActivityIndicatorIOS size='small' animating={true}/> <Text style={styles.text}> loading... </Text> </View> )},
renderFooterInifiteLoadedAll:func
renderFooterInifiteLoadedAll: () => { return ( <View style={{height:DEFAULT_HF_HEIGHT, justifyContent:'center', alignItems:'center'}}> <Text style={styles.text}> have loaded all data </Text> </View> )},
onRefresh:func
onRefresh: () => { console.log("onRefresh"); },
onInfinite':func
onInfinite: () => { console.log("onInfinite"); }
loadedAllData':func
loadedAllData: () => { return false; }