当前位置:首页 > 日记 > 正文

ReactNative列表ListView的用法

ReactNative列表ListView的用法

最近在学习ReactNative,本文介绍了ReactNative列表ListView的用法,分享给大家,也给自己留个笔记

ListView

在Android中,如果我们需要显示一个ListView,有两项是比不可少的,首先是ListView的数据源,其次是ListView每个item的样式。ReactNative中一样。首先我们来看一个简单的例子:

  constructor(props) {   super(props);   var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});   this.state = {    dataSource: ds.cloneWithRows(['row 1', 'row 2']),   };  },  render() {   return (    <ListView     dataSource={this.state.dataSource}     renderRow={(rowData) => <Text>{rowData}</Text>}    />   );  },

在render()中,我们渲染一个ListView,在ListView的属性中,我们指定了dataSource和renderRow,这两个属性分别代表ListView的数据源和渲染的每一行。

dataSource

如果我们要创建一个数据源,最基本的方法就是创建一个ListView.DataSource数据源,然后通过cloneWithRows方法为其传递一个数组。

其中提供给数据源的rowHasChanged函数可以告诉ListView它是否需要重绘一行数据,即数据是否发生了改变,即在需要重绘界面的时候会进行判断,如果之前页面中的改行数据没有发生变化,则不再进行重绘,否则进行重绘。

如上述代码,我们对数据源设置数据时直接传入一个数组,当然我们也可以通过一个获取数据的方法,在设置数据的时候调用方法即可:

  constructor(props){    super(props);    var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});    this.state = {      dataSource: ds.cloneWithRows(this._genRows()),    };  }  _genRows(){    const dataBlob = [];    for(let i = 0 ; i< 200 ; i ++ ){      dataBlob.push("aa"+i);    }    return dataBlob;  }

这样通过方法获取数据,方便我们进行一些逻辑的处理。

renderRow

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

该属性需要传入一个方法,该方法如上所示,他会从数据源中接受一条数据,以及他和他所在的section的Id,返回一个可渲染的组件来为这行数据进行渲染,默认情况下参数中的数据就是放进数据源中的数据本身,不过也可以提供一些转换器。

如果某一行正在被高亮(通过调用highlightRow函数),ListView会得到相应的通知。当一行被高亮时,其两侧的分割线会被隐藏。行的高亮状态可以通过调用highlightRow(null)来重置。

  _renderRow(rowData, sectionID, rowID){    return (        <View>          <Text>{"rowData:"+rowData+"  rowId:"+rowID}</Text>        </View>      );  }  render() {   return (    <ListView     dataSource={this.state.dataSource}     renderRow={this._renderRow}    />   );  },

因为renderRow中的方法会自动接受从数据源中的一条数据,因此我们可以通过调用外部方法的方式进行实现,同时只需要在外部方法的参数中传入我们需要从数据源中获取的数据即可,如上代码所示。

当我们需要实现比较复杂的布局时,也可以通过导入外部组件的方式作为ListView的每一行的样式。

例如我们自定义了一个组件Item_MyListView,我们需要在文件开头通过import方式将其导入到当前组件中:

 import Item_MyListView from './Item_MyListView';

然后就可以通过导入的名称直接使用我们导入的组件了:

  _renderRow(rowData, sectionID, rowID){    return (      <TouchableOpacity onPress={this._pressRow}>        <View>          <Text>{"rowData:"+rowData+"  rowId:"+rowID}</Text>          <Item_MyListView></Item_MyListView>        </View>      </TouchableOpacity>      );  }

ListView的点击

当我们需要给ListView的每一行添加点击事件时,只需要在其外层包裹一层TouchableOpacity或者TouchableHighlight,定义好onPress方法即可。

如下代码所示:

  _pressRow(rowID){    alert("hellow"+rowID);  }  _renderRow(rowData, sectionID, rowID){    return (      <TouchableOpacity onPress={()=>this._pressRow(rowID)}>        <View>          <Text>{"rowData:"+rowData+"  rowId:"+rowID}</Text>          <Item_MyListView info={rowData}></Item_MyListView>        </View>      </TouchableOpacity>      );  }

需要注意的是,在ListView的renderRow属性中调用_renderRow一定要绑定this,否则onPress中的this就会指向错误,如下所示:

复制代码 代码如下:
 <ListView dataSource={this.state.dataSource} renderRow={this._renderRow.bind(this)}/>
 

完整代码如下所示:

import React,{  View,  Text,  TouchableOpacity,  ListView,} from 'react-native';import Item_MyListView from './Item_MyListView';export default class SecondPageComponent extends React.Component{  constructor(props){    super(props);    var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});    this.state = {      dataSource: ds.cloneWithRows(this._genRows()),    };  }  _genRows(){    const dataBlob = [];    for(let i = 0 ; i< 200 ; i ++ ){      dataBlob.push("aa"+i);    }    return dataBlob;  }  _pressRow(rowID){    alert("hellow"+rowID);  }  _renderRow(rowData, sectionID, rowID){    return (      <TouchableOpacity onPress={()=>this._pressRow(rowID)}>        <View>        <Text>{"rowData:"+rowData+"  rowId:"+rowID}</Text>        <Item_MyListView info={rowData}></Item_MyListView>        </View>      </TouchableOpacity>      );  }  render(){    return (      <View style={{flex:1,}}>        <ListView dataSource={this.state.dataSource} renderRow={this._renderRow.bind(this)}/>      </View>      );  }}

 其中Item_MyListView只是随意定义了一个组件,没什么实际意义,就不再展示。

最终效果如下图所示:


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

php实现的二分查找算法示例

php实现的二分查找算法示例

算法示例,二分查找,电脑软件,php,本文实例讲述了php实现的二分查找算法。分享给大家供大家参考,具体如下:<?php$arr = array(4,58,11,34,88,45,32,54,63,78);function binary($arr,$bnum){ if(is_array($arr) && count($arr) > 0) { sort($ar…

一组树叶为主题的logo

一组树叶为主题的logo

为主题,树叶,电脑软件,logo,在现代LO设计当中,叶子的形状被视做好的创意。或者说,是一种变革的想法。在网页中他们大多被用于轻量级的解决方案、干净的不抽像的设计。在实际当中,叶子也好、植物也好、以及自然界中随处可见的装饰品。它是一种…

qq空间如何使用签到功能手机qq空间

qq空间如何使用签到功能手机qq空间

空间,方法,功能,如何使用,电脑软件,  在手机qq空间上使用签到功能,可以让我们获取积分,那么应该怎么使用呢?下面就让小编告诉大家qq空间如何使用签到功能。qq空间使用签到功能的方法首先,请大家打开手机QQ应用,在手机QQ应用主页面中点击&ldquo…

ps怎么制作一个千人成像照片拼图?

ps怎么制作一个千人成像照片拼图?

照片,成像,拼图,千人,电脑软件,现在越来越多的大型海报或是大型集体活动都会使用千人成像拼图的形式来达到活动推广的效果,这种比较新颖的形式让图画看起来很有立体感,看着很有意思,非常能沟吸引人的眼球,从而达到很好的宣传效果。今天小编教给…

Bootstrap 模态框(Modal)带参数传值

Bootstrap 模态框(Modal)带参数传值

传值,模态框,带参数,实例,电脑软件,模态框(Modal)是覆盖在父窗体上的子窗体。通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动。子窗体可提供信息、交互等。 为了实现父窗体与其的交互,通常需要向其传值,实现带…

JS排序之冒泡排序详解

JS排序之冒泡排序详解

排序,冒泡排序,详解,电脑软件,JS,本文为大家分享了JS冒泡排序的具体代码,供大家参考,具体内容如下说明时间复杂度指的是一个算法执行所耗费的时间空间复杂度指运行完一个程序所需内存的大小稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面不稳…

利用vue.js插入dom节点的方法

利用vue.js插入dom节点的方法

方法,节点,电脑软件,vue,js,本文主要介绍的是vue.js插入dom节点的方法,下面话不多说,来看看详细的介绍吧。html代码:<div id="app"></div>js代码:var MyComponent = Vue.extend({ template: '<div>Hello World</div>'})var myAppendTo = Vu…

Photoshop合成月亮下拿着弓箭的超

Photoshop合成月亮下拿着弓箭的超

拿着,月亮,弓箭,超酷,女战士,本教程主要使用Photoshop合成月亮下拿着弓箭的女战士,主要是拼接素材加上后期的色调调色完成效果,喜欢的朋友一起来学习吧!效果图:本教程所使用的素材:步骤如下:1、处理背景。抠出地面。打开地面素材,用快速选择工具…

怎么在excel2013中利用窗体控件插

怎么在excel2013中利用窗体控件插

窗体,控件,单选框,步骤,电脑软件,  Excel提供了一些具有特定功能的窗体控件,可以灵活的运用在制作报表、动态图表和其他方面。下面小编教你怎么在excel2013中利用窗体控件插入单选框。excel2013中利用窗体控件插入单选框的步骤由于单选框…

Node.js常用工具之util模块

Node.js常用工具之util模块

模块,常用工具,电脑软件,Node,js,前言util是一个Node.js的核心工具模块,提供常用的函数,用于弥补核心JavaScript提供的函数过于精简的问题。下面话不多说,一起来看看详细的介绍,文中介绍的非常详细,对大家具有一定的参考价值。util.inheritsuitl…

微信小程序教程系列之视图层的条件

微信小程序教程系列之视图层的条件

条件,视图,教程,程序,系列之,本教程为大家分享了使用wx:if进行视图层的条件渲染,供大家参考,具体内容如下使用wx:if进行视图层的条件渲染示例:wxml:使用view<!--index.wxml--><button bindtap="EventHandle">按钮</button><!-- wx:if --><vie…

如何用js判断dom是否有存在某class

如何用js判断dom是否有存在某class

如何用,电脑软件,dom,js,class,例如:<html class="no-js"><head></head><body></body></html>判断html节点的class是否有no-js。1.jquery的实现方式$("html").hasClass('no-js');jquery源码的实现方式:var rclass = /[\t\r\n\f]/g;…