`

ReactNative使用ListView加载网络数据

阅读更多
1.首先,先写一个类DemoProject,继承Component
紧接着,为他写一个构造器


     constructor(props) {
         super(props);
         this.state = {
             dataSource: new ListView.DataSource({
                 rowHasChanged: function(row1, row2) {return row1 !== row2},
             }),
             loaded: false,
         };
     }


我们在构造器中声明了一个成员变量state,并为它定义了两个属性,dataSource和loaded

由于是弱类型语言,所以不用声名类型,重点看ListView实例化的部分,这段代码


 dataSource: new ListView.DataSource({
                 rowHasChanged: function(row1, row2) {return row1 !== row2},
             })


rowHasChanged是ListView必须要实现的一个function,否则会报错,当然也可以采用lambda表达式的写法,
rowHasChanged: (row1, row2) => row1 !== row2

这样的写法使得代码更简洁。



2.Component有一个回调函数componentDidMount(),它在所有UI组建加载完成后会被调用,类似于Android中Activity生命周期的onCreate,我们在它被回调的时候发起网络请求,

     componentDidMount(){
	    this.fetchData();
     }


fetchData方法是我们自定义的请求网络的方法


     fetchData() {
         fetch(REQUEST_URL)
             .then((response) => response.json())
             .then((responseData) => {
				 console.log(responseData);
                 this.setState({
                     dataSource: this.state.dataSource.cloneWithRows(responseData.movies),
                     loaded: true,
                 });
             }).catch(function(e){		 
				 
			 })
             .done();
     }


有关fetch语句,详细可以看http://www.cnblogs.com/parry/p/using_fetch_in_nodejs.html
这里需要注意的是,console.log(responseData);这行代码,你可以在AndroidStudio的控制台下看到打印出来的信息,是一段json格式的数据,其中有一个key是movies,它的值是一段JsonArray,我们通过responseData.movies的方式取得movies的值,将它赋值给成员变量dataSource

this.state.dataSource.cloneWithRows(responseData.movies)
//这段代码的意思是填充ListView中的数据
dataSource: this.state.dataSource.cloneWithRows(responseData.movies)
//这段代码的意思是将填充好数据的ListView对象的句柄指向成员变量dataSource,当然也可以称之为引用。


3.再写一个方法,用于返回单行数据,
     renderMovie(movie) {
         return (
             <View style={styles.container}>
                 <Image
                     source={{uri: movie.posters.thumbnail}}
                     style={styles.thumbnail}
                 />
                 <View style={styles.rightContainer}>
                     <Text style={styles.title}>{movie.title}</Text>
                     <Text style={styles.year}>{movie.year}</Text>
                 </View>
             </View>
         );
     }


其中{movie.year}等,都是2中console.log(responseData)看到的服务器返回的json数据的key

4.render()方法返回整个UI


 return (
             <ListView
                 dataSource={this.state.dataSource}
                 renderRow={this.renderMovie}
                 style={styles.listView}
             />
         );

只能返回只有一个根节点的组建,不能返回多个,上面代码中,ListView中的三个属性都是原生属性,将我们实例化并且填充好数据的ListView赋值给dataSource
dataSource={this.state.dataSource}
将renderMovie方法的返回值赋值给renderRow,不做过多解释。

以下是全部代码

import React, {
    Component,
} from 'react';

import {
     AppRegistry,
     Image,
     StyleSheet,
     Text,
     View,
     ListView,
 } from 'react-native';



 var REQUEST_URL = 'https://raw.githubusercontent.com/facebook/react-native/master/docs/MoviesExample.json';


 class DemoProject extends Component
 {
     constructor(props) {
         super(props);
         this.state = {
             dataSource: new ListView.DataSource({
                 rowHasChanged: (row1, row2) => row1 !== row2,
             }),
             loaded: false,
         };
     }

     componentDidMount(){
         this.fetchData();
     }

     fetchData() {
         fetch(REQUEST_URL)
             .then((response) => response.json())
             .then((responseData) => {
				 console.log(responseData);
                 this.setState({
                     dataSource: this.state.dataSource.cloneWithRows(responseData.movies),
                     loaded: true,
                 });
             }).catch(function(e){
				 
			 })
             .done();
     }

     render() {
         if (!this.state.loaded) {
             return this.renderLoadingView();
         }

         return (
             <ListView
                 dataSource={this.state.dataSource}
                 renderRow={this.renderMovie}
                 style={styles.listView}
             />
		
         );
     }

     renderLoadingView()
     {
         return (<View style={styles.container} >
                 <Text>Loading movies......</Text>
             </View>

         );
     }

     renderMovie(movie) {
         return (
             <View style={styles.container}>
                 <Image
                     source={{uri: movie.posters.thumbnail}}
                     style={styles.thumbnail}
                 />
                 <View style={styles.rightContainer}>
                     <Text style={styles.title}>{movie.title}</Text>
                     <Text style={styles.year}>{movie.year}</Text>
                 </View>
             </View>
         );
     }


 };


 var styles = StyleSheet.create({
     container: {
         flex: 1,
         flexDirection: 'row',
         justifyContent: 'center',
         alignItems: 'center',
         backgroundColor: '#F5FCFF',
     },
     rightContainer: {
         flex: 1,
     },
     title: {
         fontSize: 20,
         marginBottom: 8,
         textAlign: 'center',
     },
     year: {
         textAlign: 'center',
     },
     thumbnail: {
         width: 53,
         height: 81,
     },
     listView: {
         paddingTop: 20,
         backgroundColor: '#F5FCFF',
     },
 });
 AppRegistry.registerComponent('AwesomeProject', () => DemoProject);






分享到:
评论

相关推荐

    一个用于ReactNative框架的纯JavaScript的杂志listview

    在React Native中,ListView是一个基本组件,用于展示大量数据的列表。然而,标准的ListView可能无法满足所有设计需求,特别是在追求独特视觉效果的场合。杂志ListView则通过JavaScript实现,旨在提供更加美观和动态...

    React-Native ListView 实现带标题的列表

    在React-Native中,ListView是用于展示大量数据的组件,它可以高效地渲染长列表,并且提供了滚动、下拉刷新和上拉加载更多等常见功能。本教程将详细讲解如何使用ListView来实现一个带有标题的列表。 首先,我们需要...

    Reactnative实现含有侧滑功能的app用Listview展示界面

    这个项目使用Listview组件来展示界面,Listview是React Native提供的一种用于渲染长列表的高效组件,它能有效地管理内存并只渲染可视区域内的元素。下面我们将深入探讨如何实现这样的功能,并结合下拉刷新和上拉加载...

    reactnative实现的折叠列表二级列表展开点击时改变字体颜色

    在React Native中构建一个具有折叠效果的二级列表,并在点击时改变字体颜色,涉及到的关键技术主要包括React Native的基础组件使用、ListView的实现以及事件处理。React Native是Facebook推出的一个开源框架,它允许...

    React native ListView 增加顶部下拉刷新和底下点击刷新示例

    在React Native中实现ListView的下拉刷新和底部点击加载更多,可以大大提高用户体验,使用户能够方便地获取最新或更多的数据。通过合理的网络请求管理和状态管理,可以有效地优化应用的性能和数据同步。记得在实际...

    react native

    5. **网络数据获取**:React Native中可以使用各种网络库,如fetch或axios,来获取远程数据。例如,描述中的demo可能就是通过fetch API从服务器获取数据,然后在ListView中展示。 **ListView组件详解** 在React ...

    reactnativerefreshlistview一个简单实现的列表下拉上拉刷新控件

    React Native Refresh ListView 是一款专为React Native设计...综上所述,React Native Refresh ListView 是React Native开发者实现列表刷新和加载功能的得力工具,通过合理的配置和使用,可以提升移动应用的交互体验。

    react native source

    15. HTTP请求的处理,包括使用fetch API进行HTTP调用,以及如何在React Native应用中进行网络编程。 本书适合于已经有一定前端开发经验的开发者,尤其是那些对React有一定了解的人。通过本书,他们可以学习到如何...

    react-native ListView下拉刷新上拉加载实现代码

    React Native 中可以使用 ListView 的 onEndReached 方法来实现上拉加载。下面是一个简单的示例代码: ``` &lt;ListView onEndReached={this._onEndReached.bind(this)} onEndReachedThreshold={5} /&gt; ``` 在上面的...

    ReactNativeListview处理大型数据集

    本文将深入探讨如何使用React Native Listview来处理大型数据集,并实现字母滚动功能。 首先,理解React Native Listview的基本概念至关重要。Listview通过虚拟化技术来优化性能,即只渲染当前屏幕可见的部分数据,...

    React Native之ListView实现九宫格效果的示例

    React Native 是一个流行的开源框架,它允许开发者使用JavaScript构建原生移动应用。在React Native中,ListView 是一个常用的组件,用于展示大量数据的列表。在本文中,我们将深入探讨如何利用ListView 实现九宫格...

    react-native-nested-scroll-view,Android NestedScrollView的React本机包装.zip

    总的来说,`react-native-nested-scroll-view`是一个非常实用的React Native库,它让开发者能够在Android应用中轻松实现复杂的嵌套滚动效果,提升用户体验,尤其是在处理大量数据或者动态加载内容的场景下。...

    react-native中ListView组件点击跳转的方法示例

    在React Native中,ListView是一个非常重要的组件,它用于展示大量可滚动的数据列表。这个组件能够高效地渲染数据,...在实际开发中,你可能还需要根据具体需求进行优化和定制,例如添加加载更多功能、处理网络请求等。

    React Native 官方文档中文版 - v1.3.pdf

    - 简介如何开始使用 React Native 构建 Android 应用程序。 2. **安装 Android 运行环境** - 提供了设置开发环境所需的步骤,包括安装必要的软件和工具。 3. **教程** - 提供了一系列实践性的指导,帮助开发者从...

    一个GmailUI原型用于ReactNative框架

    ListView是React Native中用于展示大量数据的组件,它可以高效地渲染长列表。滑动完成通常是指在用户滑动到列表底部时触发加载更多数据的机制,这在Gmail应用中很常见,因为用户可能需要滚动浏览多封邮件。实现这个...

    毕设基于React Native、Redux 开发的漫画应用程序-支持Android和iOS平台(项目源码+说明文档).zip

    自定义扩展 ListView,实现上拉加载更多、下拉刷新数据 添加缓存功能,增强用户体验 技术栈 开发框架: React Native、Redux、react-redux、redux-thunk 开发环境: Visual Studio Code 1.8 第三方库: react-native-blur...

    基于react-native的APP示例

    1. **ListView**: React-Native的ListView组件用于展示大量数据的列表,它可以根据需要加载更多的数据,优化了性能。开发者可以通过定义DataSource和renderRow方法来自定义列表项的显示。 2. **TabBar**: TabBar是...

Global site tag (gtag.js) - Google Analytics