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下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
May 13 Javascript
javascript 全等号运算符使用说明
May 31 Javascript
js检测判断日期大于多少天的方法
May 04 Javascript
谈一谈js中的执行环境及作用域
Mar 30 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
Aug 17 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
Oct 13 Javascript
vue中Axios的封装与API接口的管理详解
Aug 09 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
ES6基础之展开语法(Spread syntax)
Feb 21 Javascript
vue下的@change事件的实现
Oct 25 Javascript
JS自定义滚动条效果
Mar 13 Javascript
jquery实现拖拽添加元素功能
Dec 01 jQuery
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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
javascript学习笔记(一)基础知识
2014/09/30 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
浅谈JavaScript Math和Number对象
2015/01/26 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
Angular实现响应式表单
2017/08/04 Javascript
jQuery实现锚点向下平滑滚动特效示例
2017/08/29 jQuery
微信小程序实现发红包功能
2018/07/11 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
Python处理CSV与List的转换方法
2018/04/19 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
Python中如何引入第三方模块
2020/05/27 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
自荐信如何制作?
2014/02/21 职场文书
社区两委对照检查材料
2014/08/23 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python