React Native知识10-ListView组件

ListView - 一个核心组件,用于高效地显示一个能够垂直滚动的变化的数据列表。最基本的使用方式就是建立一个ListView.DataSource数据源,而后给它传递一个普通的数据数组,再使用数据源来实例化一个ListView组件,而且定义它的renderRow回调函数,这个函数会接受数组中的每一个数据做为参数,返回一个可渲染的组件(做为listview的每一行)。react

ListView还支持一些高级特性,譬如给每段/组(section)数据添加一个带有粘性的头部(相似iPhone的通信录,其首字母会在滑动过程当中吸附在屏幕上方);在列表头部和尾部增长单独的内容;在到达列表尾部的时候调用回调函数(onEndReached),还有在视野内可见的数据变化时调用回调函数(onChangeVisibleRows),以及一些性能方面的优化。ios

有一些性能优化使得ListView能够滚动的更加平滑,尤为是在动态加载可能很大(或者概念上无限长的)数据集的时候:git

只更新变化的行 - 提供给数据源的rowHasChanged函数能够告诉ListView它是否须要重绘一行数据(即:数据是否发生了变化)参见ListViewDataSourcegithub

限制频率的行渲染 - 默认状况下,每次消息循环只有一行会被渲染(能够用pageSize属性配置)。这把较大的工做分散成小的碎片,以下降由于渲染而致使丢帧的可能性。react-native

 

一:属性数组

1:ScrollView props... 性能优化

译注:这意味着ListView能够使用全部ScrollView的属性。微信

2:dataSource ListViewDataSource app

3:ListView.DataSource实例(列表依赖的数据源)函数

4:initialListSize number 

指定在组件刚挂载的时候渲染多少行数据。用这个属性来确保首屏显示合适数量的数据,而不是花费太多帧逐步显示出来。

5:onChangeVisibleRows function 

(visibleRows, changedRows) => void

当可见的行的集合变化的时候调用此回调函数。visibleRows 以 { sectionID: { rowID: true }}的格式包含了全部可见行,而changedRows 以{ sectionID: { rowID: true | false }}的格式包含了全部刚刚改变了可见性的行,其中若是值为true表示一个行变得可见,而为false表示行刚刚离开可视区域而变得不可见。

6:onEndReached function 

当全部的数据都已经渲染过,而且列表被滚动到距离最底部不足onEndReachedThreshold个像素的距离时调用。原生的滚动事件会被做为参数传递。译注:当第一次渲染时,若是数据不足一屏(好比初始值是空的),这个事件也会被触发。

7:onEndReachedThreshold number 

调用onEndReached以前的临界值,单位是像素。

8:pageSize number 

每次事件循环(每帧)渲染的行数。

9:removeClippedSubviews bool 

用于提高大列表的滚动性能。须要给行容器添加样式overflow:'hidden'。(Android已默认添加此样式)。此属性默认开启。

10:renderFooter function 

() => renderable

页头与页脚会在每次渲染过程当中都从新渲染(若是提供了这些属性)。若是它们重绘的性能开销很大,把他们包装到一个StaticContainer或者其它恰当的结构中。页脚会永远在列表的最底部,而页头会在最顶部。

11:renderHeader function 

renderRow function 

(rowData, sectionID, rowID, highlightRow) => renderable

从数据源(Data source)中接受一条数据,以及它和它所在section的ID。返回一个可渲染的组件来为这行数据进行渲染。默认状况下参数中的数据就是放进数据源中的数据自己,不过也能够提供一些转换器。

若是某一行正在被高亮(经过调用highlightRow函数),ListView会获得相应的通知。当一行被高亮时,其两侧的分割线会被隐藏。行的高亮状态能够经过调用highlightRow(null)来重置。

12:renderScrollComponent function 

(props) => renderable

指定一个函数,在其中返回一个能够滚动的组件。ListView将会在该组件内部进行渲染。默认状况下会返回一个包含指定属性的ScrollView。

13:renderSectionHeader function 

(sectionData, sectionID) => renderable

若是提供了此函数,会为每一个小节(section)渲染一个粘性的标题。

粘性是指当它刚出现时,会处在对应小节的内容顶部;继续下滑当它到达屏幕顶端的时候,它会停留在屏幕顶端,一直到对应的位置被下一个小节的标题占据为止。

14:renderSeparator function 

(sectionID, rowID, adjacentRowHighlighted) => renderable

若是提供了此属性,一个可渲染的组件会被渲染在每一行下面,除了小节标题的前面的最后一行。在其上方的小节ID和行ID,以及邻近的行是否被高亮会做为参数传递进来。

15:scrollRenderAheadDistance number 

当一个行接近屏幕范围多少像素以内的时候,就开始渲染这一行。

16:iosstickyHeaderIndices [number] 

一个子视图下标的数组,用于决定哪些成员会在滚动以后固定在屏幕顶端。举个例子,传递stickyHeaderIndices={[0]}会让第一个成员固定在滚动视图顶端。这个属性不能和horizontal={true}一块儿使用。

 

二:方法

1:getMetrics() 

导出一些用于性能分析的数据。

2:scrollTo(...args) 

滚动到指定的x, y偏移处,能够指定是否加上过渡动画。

参考 ScrollView#scrollTo.

 

三:实例代码

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  TextInput,
  Alert,
  ListView
} from 'react-native';

class ReactNativeProject extends Component {
  constructor(props) {
  super(props);
  var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
  this.state = {
    dataSource: ds.cloneWithRows(['第一行内容', '第二行内容']),
  };
}

render() {
  return (
    <ListView style={styles.contentContainer}
      dataSource={this.state.dataSource}
      renderRow={(rowData) => <Text>{rowData}</Text>}
    />
  );
}
}

const styles = StyleSheet.create({
  contentContainer: {
      marginTop:64,
      backgroundColor:"#ff0000",
    }
});

AppRegistry.registerComponent('ReactNativeProject', () => ReactNativeProject);

效果图:

2:图文行实例

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  TextInput,
  Alert,
  ListView,
  Image,
  TouchableOpacity,
} from 'react-native';


var THUMB_URLS = [
  {uri:"http://www.qq745.com/uploads/allimg/150408/1-15040PJ142-50.jpg"},
  {uri:"http://ww2.sinaimg.cn/large/8989048bjw1dutawvaz66j.jpg"},
  {uri:"http://img.lenovomm.com/s3/img/app/app-img-lestore/1993-2015-07-14062642-1436869602788.jpg?isCompress=true&width=342&height=513&quantity=0.8&rotate=true&dk=2"},
  {uri:"http://c.hiphotos.baidu.com/exp/whcrop=160,120/sign=57e0ac939058d109c4b6fff0be28f18e/b8389b504fc2d5620f811f00e51190ef77c66c56.jpg"},
  {uri:"http://f.hiphotos.baidu.com/exp/whcrop=160,120/sign=c3918fdeba014a90816b10ffc6070423/34fae6cd7b899e51d2350a7841a7d933c8950d26.jpg"},
  {uri:"http://f.hiphotos.baidu.com/exp/whcrop=160,120/sign=2aba0e6674c6a7efb973fe64928a9260/902397dda144ad3494292c3ed2a20cf430ad85f1.jpg"},
  {uri:"http://v1.qzone.cc/avatar/201503/04/17/44/54f6d3f8ae76c662.jpg%21200x200.jpg"},
  {uri:"http://awb.img.xmtbang.com/img/uploadnew/201510/22/8d822cf398d1482fbe3d0ac6208050c4.jpg"},
  {uri:"http://awb.img1.xmtbang.com/wechatmsg2015/article201506/20150601/thumb/6abcaf1a9c69496b8d51ec13eabfb5dd.jpg"},
  {uri:"http://photo.jokeji.cn/uppic/15-06/27/17424334047046.jpg"},
  {uri:"http://imgsrc.baidu.com/forum/w%3D580/sign=7eb05e9eddf9d72a17641015e428282a/3e87194c510fd9f9b3d66fc8212dd42a2a34a4c9.jpg"},
  {uri:"http://img3.redocn.com/tupian/20120703/pazaimeinvdatuishangdeheibaichangmaochongwugou_664529_small.jpg"},
  ];


class ReactNativeProject extends Component {

  constructor(props) {
    super(props);
    var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this.state = {
      dataSource: ds.cloneWithRows(['row 1', 'row 2','row 3','row 4','row 5','row 6','row 7','row 8','row 9','row 10','row 11','row 12']),
    };
  }

      _renderRow(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() {
        return (
          <ListView
          dataSource={this.state.dataSource}
          renderRow={this._renderRow}
        />
        );
      }
}

const styles = StyleSheet.create({
  row: {
    flexDirection: 'row',
    justifyContent: 'center',
    padding: 10,
    backgroundColor: '#F6F6F6',
  },
  thumb: {
    width: 50,
    height: 50,
  },
});

AppRegistry.registerComponent('ReactNativeProject', () => ReactNativeProject);

效果图:

 

 

最近有个妹子弄的一个关于扩大眼界跟内含的订阅号,天天都会更新一些深度内容,在这里若是你感兴趣也能够关注一下(嘿对美女跟知识感兴趣),固然能够关注后输入:github 会有个人微信号,若是有问题你也能够在那找到我;固然不感兴趣无视此信息;

相关文章
相关标签/搜索