React Native之ListView实现九宫格效果

前端之家收集整理的这篇文章主要介绍了React Native之ListView实现九宫格效果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

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


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

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确认网格数量

  1. <ListView
  2. automaticallyAdjustContentInsets={false}
  3. contentContainerStyle={styles.grid}
  4. dataSource={this.state.dataSource}
  5. renderRow={this.renderRow.bind(this)}
  6. pageSize={3}
  7. refreshControl={
  8. <RefreshControl
  9. onRefresh={this.onRefresh.bind(this)}
  10. refreshing={this.state.isLoading}
  11. colors={['#ff0000','#00ff00','#0000ff']}
  12. enabled={true}
  13. />
  14. }
  15. />
2,设置每一个网格的宽度样式

  1. itemLayout:{
  2. flex:1,width:Util.size.width/3,height:Util.size.width/3,alignItems:'center',justifyContent:'center',borderWidth: Util.pixel,borderColor: '#eaeaea'
  3. },
3,设置contentContainerStyle相应属性

  1. grid: {
  2. justifyContent: 'space-around',flexDirection: 'row',flexWrap: 'wrap'
  3. },
这里需要说明下,由于ListView的默认方向是纵向的,所以需要设置ListView的contentContainerStyle属性添加flexDirection:‘row’

其次,ListView在同一行显示,而且通过flexWrap:’wrap’设置自动换行。

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

以下是完整代码

  1. import React,{ Component } from 'react';
  2. import {
  3. AppRegistry,StyleSheet,Text,View,ListView,Image,TouchableOpacity,// 不透明触摸
  4. AlertIOS
  5. } from 'react-native';
  6.  
  7. // 获取屏幕宽度
  8. var Dimensions = require('Dimensions');
  9. const screenW = Dimensions.get('window').width;
  10.  
  11. // 导入json数据
  12. var shareData = require('./shareData.json');
  13.  
  14. // 一些常亮设置
  15. const cols = 3;
  16. const cellWH = 100;
  17. const vMargin = (screenW - cellWH * cols) / (cols + 1);
  18. const hMargin = 25;
  19.  
  20. // ES5
  21. var ListViewDemo = React.createClass({
  22. // 初始化状态值(可以变化)
  23. getInitialState(){
  24. // 创建数据源
  25. var ds = new ListView.DataSource({rowHasChanged:(r1,r2) => r1 !== r2});
  26. return{
  27. dataSource:ds.cloneWithRows(shareData.data)
  28. }
  29. },render(){
  30. return(
  31. <ListView
  32. dataSource={this.state.dataSource}
  33. renderRow={this.renderRow}
  34. contentContainerStyle={styles.listViewStyle}
  35. />
  36. );
  37. },// 返回cell
  38. renderRow(rowData){
  39. return(
  40. <TouchableOpacity activeOpacity={0.8} onPress={()=>{AlertIOS.alert('点击了')}} >
  41. <View style={styles.innerViewStyle}>
  42. <Image source={{uri:rowData.icon}} style={styles.iconStyle} />
  43. <Text>{rowData.title}</Text>
  44. </View>
  45. </TouchableOpacity>
  46. );
  47. },});
  48.  
  49. const styles = StyleSheet.create({
  50. listViewStyle:{
  51. // 主轴方向
  52. flexDirection:'row',// 一行显示不下,换一行
  53. flexWrap:'wrap',// 侧轴方向
  54. alignItems:'center',// 必须设置,否则换行不起作用
  55. },innerViewStyle:{
  56. width:cellWH,height:cellWH,marginLeft:vMargin,marginTop:hMargin,// 文字内容居中对齐
  57. alignItems:'center'
  58. },iconStyle:{
  59. width:80,height:80,},});
  60.  
  61. AppRegistry.registerComponent('ListViewDemo',() => ListViewDemo);

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

猜你在找的React相关文章