diff --git a/DataWarehouse.js b/DataWarehouse.js index c01aa66..fd19780 100644 --- a/DataWarehouse.js +++ b/DataWarehouse.js @@ -1,9 +1,13 @@ 'use strict'; var API_COVER_URL = 'http://news-at.zhihu.com/api/4/start-image/1080*1776'; var API_NEWS_URL = 'http://news-at.zhihu.com/api/4/news/latest'; +var API_NEWS_BEFORE = 'http://news.at.zhihu.com/api/4/news/before/'; +var API_STORY = 'http://news-at.zhihu.com/api/4/news/'; const DataWarehouse = { cover: API_COVER_URL, - news: API_NEWS_URL + news: API_NEWS_URL, + before: API_NEWS_BEFORE, + story: API_STORY, } module.exports = DataWarehouse; \ No newline at end of file diff --git a/MainScreen.js b/MainScreen.js index 3af88e9..1cea919 100644 --- a/MainScreen.js +++ b/MainScreen.js @@ -6,6 +6,8 @@ var React = require('react-native'); var DataWarehouse = require('./DataWarehouse'); +var StoryView = require('./Story'); +var Slider = require('./Slider'); var { StyleSheet, @@ -15,136 +17,203 @@ var { View, Image, Component, + TabBarIOS, ActivityIndicatorIOS, + StatusBarIOS, + Dimensions, } = React; -let requestUrl = DataWarehouse.news; +var deviceWidth = Dimensions.get('window').width; -// class MainScreen extends React.Component{ -// constructor(){//ES6 风格 -// super(); -// this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); -// return { -// dataSource: this.ds.cloneWithRows([]), -// }; -// } -// componentDidMount(){ -// //this._fetchData(); -// this.setState({dataSource:this.ds.cloneWithRows(["Row 1", "Row 2", "Row 3", "Row 4"])}); -// } - -// _fetchData(){ -// fetch(requestUrl) -// .then(response => response.json()) -// .then(response => { -// console.log(response); -// this.setState({ -// dataSource: this.ds.cloneWithRows(response.stories) -// }); - -// } -// );//setState之后会自动调用render函数 -// } -// renderRow(rowData, sectionID, rowID) { -// console.log(rowData); -// return ( -// -// -// -// -// -// {rowData.title} -// -// -// -// - -// -// - -// ); -// } - -// render() { -// console.log('render listview'); -// return ( -// -// -// -// ); -// } -// }; class MainScreen extends Component { constructor(props) { super(props); + this.state = { - isLoading : true - } - - this.ds = new ListView.DataSource( - {rowHasChanged: (r1, r2) => r1.id !== r2.id}); - this.state = { - dataSource: this.ds.cloneWithRows([{images:[]}]) + currentDay: 0, + dataBlob: {}, + sectionId: [], + sliderDataSource: null, + dataSource: new ListView.DataSource({//DataSource 接受这四个参数,如果数据格式不是默认的,那么需要手动实现getRowData,getSectionHeaderData两个函数 + // getRowData: this.getRowData, + // getSectionHeaderData: this.getSectionHeaderData, + rowHasChanged: (r1,r2)=>r1 !== r2, + sectionHeaderHasChanged: (s1,s2)=>s1!==s2 + }), + loaded: false }; } componentDidMount(){ - this._fetchData(); + this._fetchData(this.state.currentDay); + StatusBarIOS.setStyle(1); } - _fetchData(){ - fetch(requestUrl) + + _fetchData(date){ + var url = ''; + if(date===0){//第一次请求数据 + url = DataWarehouse.news; + } else { + url += DataWarehouse.before+date; + } + /* + * 之前的dataBlob,dataBlob数据结构为 + { + '20150101':{},// + '201412231': {} + ... + } + 这里向dataBlob中添加新数据必须返回新的对象,否则dataSource无法判断是否更新了,也就不会渲染 + */ + var sectionId = this.state.sectionId; + var dataBlob = this.state.dataBlob; + + fetch(url) .then(response => response.json()) .then(response => { - console.log(response); + var date = response.date; + //检查是否有topstories + if(response.top_stories){ + this.state.sliderDataSource = response.top_stories; + } + var newDataBlob = {}; + var newSectionId = sectionId.slice(); + newSectionId.push(date); + + dataBlob[date] = response.stories; + newDataBlob = JSON.parse(JSON.stringify(dataBlob)); + this.setState({ - dataSource: this.ds.cloneWithRows(response.stories), - isLoading: false + currentDay: date, + //sliderDataSource: response.top_stories||null, + dataBlob: newDataBlob, + sectionId: newSectionId, + dataSource: this.state.dataSource.cloneWithRowsAndSections(newDataBlob,newSectionId,null), + loaded: true }); - } - );//setState之后会自动调用render函数 + }) + + + } - + rowPressed(id){ + //跳转到story页面 + this.props.navigator.push({ + name: '', + component: StoryView, + passProps: {storyId: id} + }); + } + renderRow(rowData, sectionID, rowID) { - console.log(rowData); return ( - - - - - - {rowData.title} - - - - - - - + this.rowPressed(rowData.id)} underlayColor='#dddddd'> + + + + {rowData.title} + + + + + + + ); } - + renderSectionHeader(sectionData,sectionID){ + //sectionID = 20140101 + var dateStr = [sectionID.slice(0,4),'-',sectionID.slice(4,6),'-',sectionID.slice(6)].join(''); + var dateObj = new Date(dateStr); + var month = dateObj.getUTCMonth() + 1; + var day = dateObj.getUTCDate(); + var days = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六']; + + //今日热闻 + var sectionStyle, + text; + if(dateObj.toDateString()=== new Date().toDateString()){ + sectionStyle = styles.currentSection; + text = '今日要闻'; + } else { + sectionStyle = styles.section; + text = month+'月'+day+'日 '+ days[dateObj.getDay()]; + } + return ( + + {text} + + ); + } + _renderHeader(){ + //listview添加header + var slider = this.state.sliderDataSource? + ( + + ) + :(); + + return slider; + + } + renderFooter(){ + return ( + + + ); + } + onEndReached(){ + //listview到达底部,需要继续fetchData + //console.log(this.state.currentDay); + this._fetchData(this.state.currentDay); + + } + _onScroll(e){ + console.log(e.nativeEvent.contentOffset); + var {x,y} = e.nativeEvent.contentOffset; + // var headerStyle = styles.currentSection; + // console.log(headerStyle); + return{ + opacity: 1-y/200 + }; + + + } render() { + var spinner =