React Native基础教程—微信精选列表细节完善

在之前的章节,我们完成微信精选列表。在本章我们将一起完成详情的界面,并且为列表增加下拉刷新,上拉加载等功能。

微信精选详情

在编写详情界面之前,我们需要给应用增加一个导航控制器,就可以通过push的方式由列表跳转到详情。

class ReactNativeLearn extends Component {  
  render() {
    return (
      <NavigatorIOS
        style = {styles.container}
        initialRoute = {{
          component: NewsMain,
          title: '列表',
          barTintColor: '#28CD70',
          titleTextColor: '#4C4C4C'
        }}
      />
    );
  }
}

然后需要创建一个名为newsDetails的js文件,这就是详情的组件。用户点击列表的单个cell,跳转到详情。详情通过webview组件加载web界面。newsDetails代码如下:

class NewsDetails extends Component {
  render() {
    return (
      <WebView
          style = {styles.container}
          source={{uri: this.props.newsData.url}}
      />
    )
  }
}

还需要为newsCell添加touch组件,使newsCell能够接收用户点击。

<TouchableHighlight onPress={this.props.didCellSelected}></TouchableHighlight>

最后在newsMain的renderRow增加点击newsCell的回调函数。

renderRow(rowData) {
  return (
    <NewsCell didCellSelected={() => {
      this.props.navigator.push({
        title: '详情',
        component: NewsDetails,
        passProps: {newsData:rowData}
      });
    }} newsData={rowData}/>
  );
}

到此我们已经完成微信精选应用的开发,最终实现的效果如图:

列表.gif

细节处理

下面给微信精选列表增加下拉刷新和上拉加载的功能。

下拉刷新

给ListView的refreshControl属性设置RefreshControl组件,即可实现下拉刷新。关于RefreshControl的详细内容看这里

  onRefresh() {
    this.fetchNewsData();
  }
  
  render() {
    return (
      <View style={styles.container}>
        <ListView
         style = {styles.listContainer}
         dataSource = {this.state.dataSource}
         renderRow = {this.renderRow}
         renderSeparator = {this.renderSeparator}
         enableEmptySections={true}
         refreshControl = {
          <RefreshControl
            refreshing={this.state.isRefreshing}
            onRefresh={this.onRefresh}
            tintColor="#ff0000"
            title="Loading..."
          />
        }
        />
      </View>
    );
  }

上拉加载

现在我们再来实现上拉加载更多的功能。上拉加载更多功能需要给ListView设置onEndReachedThreshold属性和onEndReached回调函数。onEndReached当ListView滑动到距离底部不足某个像素值时被调用。onEndReachedThreshold接受Number类型的值,表示调用onEndReached需要的距离底部的像素值。

  render() {
    return (
      <View style={styles.container}>
        <ListView
         style = {styles.listContainer}
         dataSource = {this.state.dataSource}
         renderRow = {this.renderRow}
         renderSeparator = {this.renderSeparator}
         enableEmptySections={true}
         refreshControl = {
          <RefreshControl
            refreshing={this.state.isRefreshing}
            onRefresh={this.onRefresh}
            tintColor="#ff0000"
            title="Loading..."
          />
        }
        onEndReached = {this.onEndReached}
        onEndReachedThreshold = {20}
        />
      </View>
    );
  }

然后在onEndReached函数实现加载更多数据的网络请求。

  onEndReached() {
    let pagenum = 20;
    page ++;
    let newsULR = 'http://apis.baidu.com/txapi/weixin/wxhot?num='+ pagenum +'&page='+ page;
    fetch(newsULR,{
        headers: {
            "apikey": "f589f2834aeab120eef2e750e4fb1dfb"
          }
        }).then((response) => response.json())
                .catch((error) => {
            console.error('error request!');
                })
                .then((responseData) => {
            newsDataList = newsDataList.concat(responseData.newslist);
                    this.setState({
                        dataSource: this.state.dataSource.cloneWithRows(newsDataList)
                    });
                })
                .done();
  }

最后我们给列表增加一个加载动画,用户进入应用先展示加载动画,等列表数据请求完毕再展示列表数据。需要用到ActivityIndicatorIOS组件。

  render() {
    if (this.state.activityIndicator) {
      return (
        <View style={styles.container}>
          <ActivityIndicatorIOS
                    animating = {this.state.animating}
                    style = {styles.activityIndicator}
                    size = 'large'
                    color = 'rgb(230, 145, 0)'
          />
        </View>
      );
    }
    return (
      <View style={styles.container}>
        <ListView
           style = {styles.listContainer}
           dataSource = {this.state.dataSource}
           renderRow = {this.renderRow}
           renderSeparator = {this.renderSeparator}
           enableEmptySections={true}
           refreshControl = {
              <RefreshControl
                refreshing={this.state.isRefreshing}
                onRefresh={this.onRefresh}
                tintColor="#ff0000"
                title="Loading..."
              />
           }
           onEndReached = {this.onEndReached}
           onEndReachedThreshold = {20}
        />
      </View>
    );
  }

最终的效果:

微信精选.gif

到此,我们已经完成微信精选列表的全部开发工作。相信大家对React Native Apps的开发已经有一定的了解。

项目完整源码

项目的完整源码下载地址。

祝大家玩得愉快!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容