React Native基礎(chǔ)教程—微信精選列表細(xì)節(jié)完善

在之前的章節(jié)撞羽,我們完成微信精選列表认罩。在本章我們將一起完成詳情的界面,并且為列表增加下拉刷新掰担,上拉加載等功能汇陆。

微信精選詳情

在編寫詳情界面之前,我們需要給應(yīng)用增加一個(gè)導(dǎo)航控制器恩敌,就可以通過push的方式由列表跳轉(zhuǎn)到詳情瞬测。

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

然后需要?jiǎng)?chuàng)建一個(gè)名為newsDetails的js文件横媚,這就是詳情的組件纠炮。用戶點(diǎn)擊列表的單個(gè)cell月趟,跳轉(zhuǎn)到詳情。詳情通過webview組件加載web界面恢口。newsDetails代碼如下:

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

還需要為newsCell添加touch組件孝宗,使newsCell能夠接收用戶點(diǎn)擊。

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

最后在newsMain的renderRow增加點(diǎn)擊newsCell的回調(diào)函數(shù)耕肩。

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

到此我們已經(jīng)完成微信精選應(yīng)用的開發(fā)因妇,最終實(shí)現(xiàn)的效果如圖:

列表.gif

細(xì)節(jié)處理

下面給微信精選列表增加下拉刷新和上拉加載的功能。

下拉刷新

給ListView的refreshControl屬性設(shè)置RefreshControl組件猿诸,即可實(shí)現(xiàn)下拉刷新婚被。關(guān)于RefreshControl的詳細(xì)內(nèi)容看這里

  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>
    );
  }

上拉加載

現(xiàn)在我們?cè)賮韺?shí)現(xiàn)上拉加載更多的功能梳虽。上拉加載更多功能需要給ListView設(shè)置onEndReachedThreshold屬性和onEndReached回調(diào)函數(shù)址芯。onEndReached當(dāng)ListView滑動(dòng)到距離底部不足某個(gè)像素值時(shí)被調(diào)用。onEndReachedThreshold接受Number類型的值窜觉,表示調(diào)用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函數(shù)實(shí)現(xiàn)加載更多數(shù)據(jù)的網(wǎng)絡(luò)請(qǐng)求。

  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();
  }

最后我們給列表增加一個(gè)加載動(dòng)畫禀挫,用戶進(jìn)入應(yīng)用先展示加載動(dòng)畫旬陡,等列表數(shù)據(jù)請(qǐng)求完畢再展示列表數(shù)據(jù)。需要用到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

到此描孟,我們已經(jīng)完成微信精選列表的全部開發(fā)工作。相信大家對(duì)React Native Apps的開發(fā)已經(jīng)有一定的了解腻格。

項(xiàng)目完整源碼

項(xiàng)目的完整源碼下載地址画拾。

祝大家玩得愉快!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菜职,一起剝皮案震驚了整個(gè)濱河市青抛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酬核,老刑警劉巖蜜另,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嫡意,居然都是意外死亡举瑰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蔬螟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來此迅,“玉大人,你說我怎么就攤上這事∷市颍” “怎么了忍些?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坎怪。 經(jīng)常有香客問我罢坝,道長(zhǎng),這世上最難降的妖魔是什么搅窿? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任嘁酿,我火速辦了婚禮,結(jié)果婚禮上男应,老公的妹妹穿的比我還像新娘闹司。我一直安慰自己,他們只是感情好沐飘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布开仰。 她就那樣靜靜地躺著,像睡著了一般薪铜。 火紅的嫁衣襯著肌膚如雪众弓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天隔箍,我揣著相機(jī)與錄音谓娃,去河邊找鬼。 笑死蜒滩,一個(gè)胖子當(dāng)著我的面吹牛滨达,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俯艰,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捡遍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了竹握?” 一聲冷哼從身側(cè)響起画株,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啦辐,沒想到半個(gè)月后谓传,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芹关,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年续挟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥衬。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡双饥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出默穴,到底是詐尸還是另有隱情,我是刑警寧澤聋亡,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站际乘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏漂佩。R本人自食惡果不足惜脖含,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望投蝉。 院中可真熱鬧养葵,春花似錦、人聲如沸瘩缆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庸娱。三九已至着绊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熟尉,已是汗流浹背归露。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斤儿,地道東北人剧包。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像往果,于是被迫代替她去往敵國(guó)和親疆液。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評(píng)論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,755評(píng)論 22 665
  • 最近做了一個(gè)Android UI相關(guān)開源項(xiàng)目庫匯總陕贮,里面集合了OpenDigg 上的優(yōu)質(zhì)的Android開源項(xiàng)目庫...
    OpenDigg閱讀 17,195評(píng)論 6 222
  • 考上三本學(xué)校簡(jiǎn)直就是災(zāi)難 高考之前沒有什么感覺堕油,高考完填志愿之后沒有什么感覺,交了一萬多的學(xué)費(fèi)后肮之,還是很麻木馍迄,聯(lián)上...
    天真的無邪閱讀 203評(píng)論 0 0
  • 提到文科生攀圈,你我可能不由想到文縐縐這個(gè)詞語。從古至今世人給文科生定義差不多都是寫的一手好文章峦甩。如果說文科生不會(huì)寫文...
    常小明a閱讀 153評(píng)論 0 0