1. 程式人生 > >【React Native開發】React Native控制元件之ListView元件講解以及最齊全例項(19)

【React Native開發】React Native控制元件之ListView元件講解以及最齊全例項(19)

轉載請標明出處:

()前言

        【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org

今天我們一起來看一下ListView元件的使用詳解以及具體事例

剛建立的React Native技術交流3群(496508742),React Native技術交流4群(458982758),請不要重複加群!歡迎各位大牛,React Native技術愛好者加入交流!同時部落格左側歡迎微信掃描關注訂閱號,移動技術乾貨,精彩文章技術推送!

ListView元件是React Native中一個比較核心的元件,用途非常的廣。該元件設計用來高效的展示垂直滾動的資料列表。最簡單的API就是建立一個

ListView.DataSource物件,同時給該物件傳入一個簡單的資料集合。並且使用資料來源(data source)例項化一個ListView元件,定義一個renderRow回撥方法(該方法的引數是一個數組),該renderRow方法會返回一個可渲染的元件(該就是列表的每一行的item)

()官方ListView簡單例項

下面看一個關於ListView最簡單的例子:

'use strict';
import React, {
  AppRegistry,
  Component,
  StyleSheet,
  Text,
  View,
  ListView,
} from'react-native';
var ListViewDemo =React.createClass({
    getInitialState: function() {
      var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
        return {
          dataSource: ds.cloneWithRows(['row1', 'row 2','row 3','row 4','row 5','row 6','row 7','row 8']),
        };
    },
    render: function() {
      return (
        <ListView
          dataSource={this.state.dataSource}
          renderRow={(rowData) =><Text>{rowData}</Text>}
        />
      );
    }
});
AppRegistry.registerComponent('ListViewDemo',() => ListViewDemo);

例項執行效果如下:


()高階特性

         ListView可以支援一些高階特性,包括設定每一組的粘性的頭部(類似於iPhone)、支援設定列表的header以及footer檢視、當資料列表滑動到最底部的時候支援onEndReached方法回撥、裝置螢幕列表可見的檢視資料發生變化的時候回撥onChangeVisibleRows以及一些效能方面的優化特性。

ListView設計的時候,當需要動態載入非常大的資料的時候,下面有一些方法效能優化的方法可以讓我媽ListView滾動的時候更加平滑:

  • 只更新渲染資料變化的那一行,rowHasChanged方法會告訴ListView元件是否需要重新渲染當前那一行。具體可以檢視
    ListViewDataSource例項
  • 選擇渲染的頻率預設情況下面每一個event-loop(事件迴圈)只會渲染一行(可以同pageSize自定義屬性設定)。這樣可以把大的工作量進行分隔,提供整體渲染的效能。

()基本屬性方法

  • ScrollView相關屬性樣式全部繼承
  • dataSource   ListViewDataSource  設定ListView的資料來源
  • initialListSize  number  進行設定ListView元件剛剛載入的時候渲染的列表行數,用這個屬性確定首屏或者首頁載入的數量,而不是花大量的時間渲染載入很多頁面資料,提供效能哦
  • onChangeVisibleRows  function  (visibleRows,changedRows)=>void。當可見的行發生變化的時候回撥該方法。visibleRows引數對所有可見的行為{selectionID:{rowId:true}}的形式,changedRow引數對已經改變可見的行為{selectionID:{rowID:true|false}}。該值true代表可見,false代表在檢視之外不可見的行。
  • onEndReachedThreshold  number 當偏移量達到設定的臨界值呼叫onEndReached
  • onEndReached function 方法,當所有的資料項行被渲染之後,並且列表往下進行滾動。一直滾動到距離底部onEndReachedThredshold設定的值進行回撥該方法。原生的滾動事件進行傳遞(通過引數的形式)
  • pageSize   number 每一次事件的迴圈渲染的行數
  • removeClippedSubviews  bool  該屬性用於提供大資料列表的滾動效能。該使用的時候需要給每一行(row)的佈局新增over:'hidden'樣式。該屬性預設是開啟狀態。
  • renderFooter function 方法  ()=>renderable ,在每次渲染過程中頭和尾總會重新進行渲染。如果發現該重新繪製的效能開銷比較大的時候,可以使用StaticContainer容器或者其他合適的元件。在每一次渲染過程中Footer()該會一直在列表的底部,header()該會一直在列表的頭部
  • renderHeader  function 方法使用情況和上面的renderFooter差不多
  • renderRow function 方法   (rowData,sectionID,rowID,highlightRow)=>renderable   該方法有四個引數,其中分別為資料來源中一條資料,分組的ID,行的ID,以及標記是否是高亮選中的狀態資訊。
  • renderScrollComponent function 方法 (props)=>renderable  該方法可以返回一個可以滾動的元件。預設該會返回一個ScrollView
  • renderSectionHeader function (sectionData,sectionID)=>renderable   如果設定了該方法,這樣會為每一個section渲染一個粘性的header檢視。該檢視粘性的效果是當剛剛被渲染開始的時候,該會處於對應的內容的頂部,然後開始滑動的時候,該會跑到螢幕的頂端。直到滑動到下一個section的header()檢視,然後被替代為止。
  • renderSeparator function  (sectionID,rowID,adjacentRowHighlighted)=>renderable 如果設定該方法,會在被每一行的下面渲染一個元件作為分隔。除了每一個section分組的頭部檢視前面的最後一行。
  • scrollRenderAheadDistance number  進行設定當該行進入螢幕多少畫素以內之後就開始渲染該行

()使用例項

     5.1.首先看一個相對簡單的例項,列表每一行顯示一個圖片以及文字,具體程式碼如下:

'use strict';
import React, {
  AppRegistry,
  Component,
  StyleSheet,
  Text,
  View,
  ListView,
  Image,
  TouchableOpacity,
} from'react-native';
var THUMB_URLS = [
  require('./imgs/like.png'),
  require('./imgs/dislike.png'),
  require('./imgs/call.png'),
  require('./imgs/fist.png'),
  require('./imgs/bandaged.png'),
  require('./imgs/flowers.png'),
  require('./imgs/heart.png'),
  require('./imgs/liking.png'),
  require('./imgs/party.png'),
  require('./imgs/poke.png'),
  require('./imgs/superlike.png'),
  require('./imgs/victory.png'),
  ];
var ListViewDemo =React.createClass({
    getInitialState: function() {
      var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
        return {
          dataSource: ds.cloneWithRows(['row1', 'row 2','row 3','row 4','row 5','row 6','row 7','row 8','row 9','row10','row 11','row 12']),
        };
    },
    _renderRow: function(rowData: string,sectionID: number, rowID: number) {
    var imgSource = THUMB_URLS[rowID];
    return (
        <TouchableOpacity>
          <View>
            <View style={styles.row}>
              <Image style={styles.thumb} source={imgSource} />
              <Text style={{flex:1,fontSize:16,color:'blue'}}>
                {rowData + '我是測試行號哦~'}
              </Text>
            </View>
          </View>
        </TouchableOpacity>
    );
   },
    render: function() {
      return (
        <ListView
          dataSource={this.state.dataSource}
          renderRow={this._renderRow}
        />
      );
    }
});
var styles =StyleSheet.create({
  row: {
    flexDirection: 'row',
    justifyContent: 'center',
    padding: 10,
    backgroundColor: '#F6F6F6',
  },
  thumb: {
    width: 50,
    height: 50,
  },
});
AppRegistry.registerComponent('ListViewDemo',() => ListViewDemo);

執行效果如下:


    5.2.例項實現表格佈局,程式碼如下:

'use strict';
var React =require('react-native');
var {
  AppRegistry,
  Image,
  ListView,
  TouchableHighlight,
  StyleSheet,
  Text,
  View,
} = React;
 
var THUMB_URLS = [
  require('./imgs/like.png'),
  require('./imgs/dislike.png'),
  require('./imgs/call.png'),
  require('./imgs/fist.png'),
  require('./imgs/bandaged.png'),
  require('./imgs/flowers.png'),
  require('./imgs/heart.png'),
  require('./imgs/liking.png'),
  require('./imgs/party.png'),
  require('./imgs/poke.png'),
  require('./imgs/superlike.png'),
  require('./imgs/victory.png'),
  require('./imgs/logo.png'),
];
 
var ListViewDemo =React.createClass({
  getInitialState: function() {
    var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    return {
      dataSource:ds.cloneWithRows(this._genRows({})),
    };
  },
  _pressData: ({}: {[key: number]: boolean}),
  componentWillMount: function() {
    this._pressData = {};
  },
  render: function() {
    return (
      <ListView
        initialListSize={12}
        contentContainerStyle={styles.list}
        dataSource={this.state.dataSource}
        renderRow={this._renderRow}
      />
    );
  },
  _renderRow: function(rowData: string,sectionID: number, rowID: number) {
    var imgSource = THUMB_URLS[rowID];
    return (
      <TouchableHighlight underlayColor="red">
        <View>
          <View style={styles.row}>
            <Image style={styles.thumb} source={imgSource} />
            <Text style={styles.text}>
              {rowData}
            </Text>
          </View>
        </View>
      </TouchableHighlight>
    );
  },
  _genRows: function(pressData: {[key: number]:boolean}): Array<string> {
    var dataBlob = [];
    for (var ii = 0; ii < THUMB_URLS.length;ii++) {
      dataBlob.push('單元格 ' + ii);
    }
    return dataBlob;
  },
});
var styles =StyleSheet.create({
  list: {
    marginTop:5,
    justifyContent: 'space-around',
    flexDirection: 'row',
    flexWrap: 'wrap'
  },
  row: {
    justifyContent: 'center',
    padding: 5,
    margin: 3,
    width: 85,
    height: 85,
    backgroundColor: '#F6F6F6',
    alignItems: 'center',
    borderWidth: 1,
    borderRadius: 5,
    borderColor: '#CCC'
  },
  thumb: {
    width: 45,
    height: 45
  },
  text: {
    flex: 1,
    marginTop: 5,
    fontWeight: 'bold'
  },
});
AppRegistry.registerComponent('ListViewDemo',() => ListViewDemo);

執行效果如下:


()最後總結

今天我們主要學習一下ListView元件的諒解以及相關例項演示。大家有問題可以加一下群React Native技術交流群(282693535)或者底下進行回覆一下。

       關注我的訂閱號(codedev123),每天分享移動開發技術(Android/IOS),專案管理以及部落格文章!(歡迎關注,第一時間推送精彩文章)

     關注我的微博,可以獲得更多精彩內容

      

相關推薦

React Native開發React Native控制元件ListView元件講解以及齊全例項(19)

轉載請標明出處:(一)前言        【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org今天我們一起來看一下ListView元件的使用詳解以及具體事例剛建立的React Native技術交流3群(496508742),Rea

React Native開發React Native控制元件Image元件講解與美團首頁頂部效果例項(10)

轉載請標明出處:(一)前言        【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org      今天我們一起來看一下Image元件的相關使用講解以及模仿實現一下美團首頁頂部分類的效果。具體環境搭建以及相關配置的請檢視之前

React Native開發React Native控制元件TextInput元件講解與QQ登入介面實現(11)

轉載請標明出處:(一)前言      【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org       今天我們一起來看一下文字輸入框TextInput元件的相關使用講解以及模仿實現一下QQ登入介面的效果。具體環境搭建以及相關配置

React Native開發React Native控制元件View檢視講解(7)

轉載請標明出處:(一)前言      【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org       現在幾講我們對於R

React Native開發React Native控制元件RefreshControl元件詳解(21)

轉載請標明出處:(一)前言         【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org        今天我們一起來看一下RefreshControl下拉重新整理元件講解以及使用例項剛建立的React Native技術交

React Native開發React Native控制元件DrawerLayoutAndroid抽屜導航切換元件講解(13)

轉載請標明出處:(一)前言      【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org       今天我們一起來看一

React Native開發React Native控制元件Switch開關與Picker選擇器元件講解以及使用(16)

轉載請標明出處:(一)前言       【好訊息】個人網站已經上線執行,後面部落格以及技術乾貨等精彩文章會同步更新,請大家關注收藏:http://www.lcode.org       今天我們一起來看

React Native開發React Native控件ProgressBarAndroid進度條解說(12)

ice 發現 來講 top 文章 func dev all ios 轉載請標明出處:http://blog.csdn.net/developer_jiangqq/article/details/50596367本文出自:【江清清的博客】(一)前言 【好消息】

FastDev4Android框架開發AndroidAnnnotations注入框架使用最佳實踐SharedPreferences(十七)

轉載請標明出處:  (一).前言:    前面我們已經對於AndroidAnnotations使用Adapters和lists做了講解,今天我們開始具體學習一下使用DI框架SharedPrefe

React Native開發關於fetch方法設定cookie

一般來說,在網上隨便搜一下,都會有文章說fetch方法預設是不攜帶cookie的,要想攜帶cookie, 需要新增: credentials: 'include' 例如: fetch(url, { method: 'POST', headers: {

React Native開發關於UTC格式時間轉換為時間戳的問題

問題背景: 需要將UTC格式的時間字串(形如2018-10-30T07:00:00+0000)轉換為時間戳(形如1540882800) 問題描述: var time=new Date("2018-10-30T07:00:00+0000"); 發現release(sto

React Native開發

很多時候我們需要在App中嵌入一個活動頁面我們需要不定時的開始一個活動,又不定時的結束一個活動。如果使用Native 開發,需要更新APP,這對應使用者來說,是很不好的體驗,因此,我們可以藉助WebV

React Native開發- 觸控事件處理

1.介紹 React Native提供了可以處理觸控事件的元件。觸控即點選、長按、滑動、縮放。 2.點選 處理點選操作事件,可以使用Touchable類元件,通過此類元件的onPress屬性實現點選事

巨能坑react-native的大坑,不定期更新

注:寫頁面時,當子元件是<Text>時一定不要固定父元件的寬高。 ----------------------------------------------------------------------------------------------

RN踩坑React-native 0.45版本以上出現 boost_1_63_0.tar.gz等錯誤

請先下載第三方依賴檔案 下下來後請放置到 ~/.rncache 目錄 比如你可以開啟終端,輸入 # 井號表示註釋,不要複製井號開頭的句子 # 進入~目錄,即使用者目錄 cd ~

React-Native開發react-navigation開發中的一些常見的坑

1 前言 都說RN開發效率高,一次學習隨處編寫。真的用RN開發了一個APP才知道,RN中坑真是太多,特別是很多坑只有在生產模式下才會出現,在平常的debug模式下,APP執行好好的,但是你一旦打正式包,就會發現各種報錯,各種崩潰,如果在Android平臺下,各種相容性,各種奇葩的問題

React-Native開發react-navigationAndroid的打包與釋出

1前言 RN的開發中正式釋出前需要打包與簽名,然後才能上架各家應用市場。打包需要將js與圖片資原始檔打包進apk檔案中,生成index.android.bundle與index.android.bundle.meta檔案。下面介紹RN開發中打包APK的主要步驟,IOS沒研究過,不再本

React-Native開發react-navigation自定義元件Counter

1 前言 我們知道RN中任何介面元素都可以看成元件,小到一個按鈕,大到一個頁面。RN開發就是不停的開發元件和使用元件,並讓他們協同工作,這樣高效率協同的執行起來,這樣就能完成一個APP的功能了 在實際的開發中,我們經常需要自定義一些滿足我們專案開發的自定義元件,類似於Android

React-Native開發react-navigationAsyncStorage資料儲存

1 前言 我們都知道,在Android和IOS中分別有不同的持久化資料方式,例如Android中的檔案,資料庫,SharePrefences等。AsyncStorage是一個簡單的key-value儲存系統,是RN官方推薦的。它儲存的都是String型別的資料,是一個RN中輕量級的資

React-Native開發react-navigationStackNavigator簡介

1 前言 react-navigation是RN開發中一款開源的導航元件,它的功能包括StackNavigator,TabNavigator,DrawerNavigator。react-navigation的出現替代了Navigator、 Ex-Navigation等老一代的導航元件