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


Posted in Javascript onAugust 02, 2017

概述

在安卓原生开发中,ListView是很常用的一个列表控件,那么React Native(RN)如何实现该功能呢?我们来看一下ListView的源码

ListView是基于ScrollView扩展得来的,所以具有ScrollView的相关属性:

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

dataSource:数据源,类似于安卓中我们传入BaseAdapter的数据集合。

renderRow:渲染某一行,类似于BaseAdapter中的getItem方法。

onEndReached:简单说就是用于分页操作,在安卓中原生开发中,我们需要自己实现相应的方法。

onEndReachedThreshold:调用onEndReached之前的临界值,单位是像素。

refreshControl:指定RefreshControl组件,用于为ScrollView提供下拉刷新功能。(该属性是继承与ScrollView)

renderHeader:渲染头部View,类似于安卓ListView中的addHeader.

以上的属性基本可以解决一些常见的列表需求,如果我们想要实现网格的效果,也可以借助该组件来实现,有点类似于安卓中的RecyclerView控件。

pageSize:渲染的网格数,类似于安卓GridView中的numColumns.

contentContainerStyle:该属性是继承于ScrollView,主要作用于该组件的内容容器上。

要用ListView实现九宫格的效果:

1,配置pageSize确认网格数量

<ListView  
   automaticallyAdjustContentInsets={false}  
   contentContainerStyle={styles.grid}  
   dataSource={this.state.dataSource}  
   renderRow={this.renderRow.bind(this)}  
   pageSize={3}  
   refreshControl={  
     <RefreshControl  
      onRefresh={this.onRefresh.bind(this)}  
      refreshing={this.state.isLoading}  
      colors={['#ff0000', '#00ff00', '#0000ff']}  
      enabled={true}  
      />  
    }  
   />

2,设置每一个网格的宽度样式

itemLayout:{  
  flex:1,  
  width:Util.size.width/3,  
  height:Util.size.width/3,  
  alignItems:'center',  
  justifyContent:'center',  
  borderWidth: Util.pixel,  
  borderColor: '#eaeaea'  
 },

3,设置contentContainerStyle相应属性

grid: {  
  justifyContent: 'space-around',  
  flexDirection: 'row',  
  flexWrap: 'wrap'  
 },

这里需要说明下,由于ListView的默认方向是纵向的,所以需要设置ListView的contentContainerStyle属性,添加flexDirection:‘row'。其次,ListView在同一行显示,而且通过flexWrap:'wrap'设置自动换行。

注:flexWrap属性:wrap、nowrap,wrap:空间不足的情况下自动换行,nowrap:空间不足,压缩容器,不会自动换行。

以下是完整代码:

import React, { Component } from 'react'; 
import { 
  AppRegistry, 
  StyleSheet, 
  Text, 
  View, 
  ListView, 
  Image, 
  TouchableOpacity, // 不透明触摸 
  AlertIOS 
} from 'react-native'; 
 
// 获取屏幕宽度 
var Dimensions = require('Dimensions'); 
const screenW = Dimensions.get('window').width; 
 
// 导入json数据 
var shareData = require('./shareData.json'); 
 
// 一些常亮设置 
const cols = 3; 
const cellWH = 100; 
const vMargin = (screenW - cellWH * cols) / (cols + 1); 
const hMargin = 25; 
 
// ES5 
var ListViewDemo = React.createClass({ 
  // 初始化状态值(可以变化) 
  getInitialState(){ 
    // 创建数据源 
    var ds = new ListView.DataSource({rowHasChanged:(r1,r2) => r1 !== r2}); 
    return{ 
      dataSource:ds.cloneWithRows(shareData.data) 
    } 
  }, 
 
  render(){ 
    return( 
      <ListView 
        dataSource={this.state.dataSource} 
        renderRow={this.renderRow} 
        contentContainerStyle={styles.listViewStyle} 
      /> 
    ); 
  }, 
 
  // 返回cell 
  renderRow(rowData){ 
    return( 
      <TouchableOpacity activeOpacity={0.8} onPress={()=>{AlertIOS.alert('点击了')}} > 
        <View style={styles.innerViewStyle}> 
          <Image source={{uri:rowData.icon}} style={styles.iconStyle} /> 
          <Text>{rowData.title}</Text> 
        </View> 
      </TouchableOpacity> 
    ); 
  }, 
}); 
 
const styles = StyleSheet.create({ 
  listViewStyle:{ 
    // 主轴方向 
    flexDirection:'row', 
    // 一行显示不下,换一行 
    flexWrap:'wrap', 
    // 侧轴方向 
    alignItems:'center', // 必须设置,否则换行不起作用 
  }, 
 
  innerViewStyle:{ 
    width:cellWH, 
    height:cellWH, 
    marginLeft:vMargin, 
    marginTop:hMargin, 
    // 文字内容居中对齐 
    alignItems:'center' 
  }, 
 
  iconStyle:{ 
    width:80, 
    height:80, 
  }, 
 
}); 
 
AppRegistry.registerComponent('ListViewDemo', () => ListViewDemo);

效果如图(数据源自己加)

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

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

Javascript 相关文章推荐
iframe子父页面调用js函数示例
Nov 07 Javascript
学习JavaScript设计模式之责任链模式
Jan 18 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
Mar 11 Javascript
Javascript 函数的四种调用模式
Nov 05 Javascript
PHP+jquery+ajax实现分页
Dec 09 Javascript
javascript 显示全局变量与隐式全局变量的区别
Feb 09 Javascript
vue页面跳转后返回原页面初始位置方法
Feb 11 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
Dec 29 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
May 05 Javascript
Jquery实现获取子元素的方法分析
Aug 24 jQuery
Python版实现微信公众号扫码登陆
May 28 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
Feb 14 Javascript
jQuery初级教程之网站品牌列表效果
Aug 02 #jQuery
ReactNative列表ListView的用法
Aug 02 #Javascript
ReactNative页面跳转Navigator实现的示例代码
Aug 02 #Javascript
利用JavaScript实现栈的数据结构示例代码
Aug 02 #Javascript
easyui-datagrid开发实践(总结)
Aug 02 #Javascript
js如何编写简单的ajax方法库
Aug 02 #Javascript
JavaScript实现无刷新上传预览图片功能
Aug 02 #Javascript
You might like
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
php实现生成验证码实例分享
2016/04/10 PHP
javascript确认框的三种使用方法
2013/12/17 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
快速入门Vue
2016/12/19 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python实现控制台输入密码的方法
2015/05/29 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
购买中国最好的电子产品:Geekbuying
2018/03/13 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
家长会欢迎标语
2014/06/24 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
2014年销售经理工作总结
2014/12/01 职场文书
周年庆典答谢词
2015/01/20 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
三好学生竞选稿范文
2019/08/21 职场文书