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 相关文章推荐
在 IE 中调用 javascript 打开 Excel 表
Dec 21 Javascript
Javascript 数组排序详解
Oct 22 Javascript
Javascript Object 对象学习笔记
Dec 17 Javascript
JS建造者模式基本用法实例分析
Jun 30 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
Dec 26 Javascript
微信小程序 解决swiper不显示图片的方法
Jan 04 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
Jun 01 Javascript
js canvas实现写字动画效果
Nov 30 Javascript
Vue + ts实现轮播插件的示例
Nov 10 Javascript
Vue中Object.assign清空数据报错的解决方案
Mar 03 Vue.js
避坑之 JavaScript 中的toFixed()和正则表达式
Apr 19 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
JavaScript字符串对象split方法入门实例(用于把字符串分割成数组)
2014/10/16 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
浅析node应用的timing-attack安全漏洞
2018/02/28 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
微信小程序自定义支持图片的弹窗
2020/12/21 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
疯狂上涨的Python 开发者应从2.x还是3.x着手?
2017/11/16 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
体育教育专业自荐信范文
2013/12/20 职场文书
理工类毕业自我鉴定
2014/02/20 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
部门2014年度工作总结
2014/11/12 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js