最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

ReactNative列表ListView的用法

来源:懂视网 责编:小采 时间:2020-11-27 22:33:28
文档

ReactNative列表ListView的用法

ReactNative列表ListView的用法:最近在学习ReactNative,本文介绍了ReactNative列表ListView的用法,分享给大家,也给自己留个笔记 ListView 在Android中,如果我们需要显示一个ListView,有两项是比不可少的,首先是ListView的数据源,其次是ListView每个item的样式。Rea
推荐度:
导读ReactNative列表ListView的用法:最近在学习ReactNative,本文介绍了ReactNative列表ListView的用法,分享给大家,也给自己留个笔记 ListView 在Android中,如果我们需要显示一个ListView,有两项是比不可少的,首先是ListView的数据源,其次是ListView每个item的样式。Rea

最近在学习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只是随意定义了一个组件,没什么实际意义,就不再展示。

最终效果如下图所示:


声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

ReactNative列表ListView的用法

ReactNative列表ListView的用法:最近在学习ReactNative,本文介绍了ReactNative列表ListView的用法,分享给大家,也给自己留个笔记 ListView 在Android中,如果我们需要显示一个ListView,有两项是比不可少的,首先是ListView的数据源,其次是ListView每个item的样式。Rea
推荐度:
标签: 使用 用法 列表
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top