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 相关文章推荐
手把手教你自己写一个js表单验证框架的方法
Sep 14 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
Feb 27 Javascript
使用Math.floor与Math.random取随机整数的方法详解
May 07 Javascript
通过JS来判断页面控件是否获取焦点
Jan 03 Javascript
调整小数的格式保留小数点后两位
May 14 Javascript
Js为表单动态添加节点内容的方法
Feb 10 Javascript
jQuery鼠标事件汇总
Aug 30 Javascript
AngularJS入门教程之数据绑定原理详解
Nov 02 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
Feb 26 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
Apr 20 jQuery
angularJs在多个控制器中共享服务数据的方法
Sep 30 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
Apr 26 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
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php使用异或实现的加密解密实例
2013/09/04 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
php数组和链表的区别总结
2019/09/20 PHP
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
JS作用域深度解析
2016/12/29 Javascript
纯JS实现轮播图
2017/02/22 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
python 如何将office文件转换为PDF
2020/09/22 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
什么是数组名
2012/05/10 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
银行稽核岗位职责
2015/04/13 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS