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

发布时间 - 2026-01-11 02:36:55    点击率:

概述

在安卓原生开发中,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确认网格数量

<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  # 实现九宫格  # 九宫格  # ReactNative列表ListView的用法  # React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)  # 类似于  # 换行  # 临界值  # 要用  # 分页  # 如图  # 来实现  # 得来  # 大家多多  # 如何实现  # 设置自动  # 作用于  # 不透明  # 不起作用  # 情况下  # 是基于  # borderWidth  # colors  # state 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站建设整体流程解析,建站其实很容易!  免费视频制作网站,更新又快又好的免费电影网站?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Python并发异常传播_错误处理解析【教程】  如何挑选高效建站主机与优质域名?  Laravel如何为API生成Swagger或OpenAPI文档  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何在阿里云部署织梦网站?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  简单实现Android验证码  如何生成腾讯云建站专用兑换码?  微信小程序 canvas开发实例及注意事项  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Python进程池调度策略_任务分发说明【指导】  网站制作壁纸教程视频,电脑壁纸网站?  Python函数文档自动校验_规范解析【教程】  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何在建站之星绑定自定义域名?  iOS正则表达式验证手机号、邮箱、身份证号等  高端建站三要素:定制模板、企业官网与响应式设计优化  Laravel如何实现API资源集合?(Resource Collection教程)  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  Android GridView 滑动条设置一直显示状态(推荐)  如何在IIS中新建站点并配置端口与IP地址?  nginx修改上传文件大小限制的方法  Laravel怎么在Controller之外的地方验证数据  如何在阿里云虚拟服务器快速搭建网站?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel如何处理表单验证?(Requests代码示例)  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  西安专业网站制作公司有哪些,陕西省建行官方网站?  IOS倒计时设置UIButton标题title的抖动问题  教你用AI将一段旋律扩展成一首完整的曲子  Laravel Fortify是什么,和Jetstream有什么关系  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  如何快速搭建二级域名独立网站?  浅析上传头像示例及其注意事项  如何挑选优质建站一级代理提升网站排名?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  深入理解Android中的xmlns:tools属性  bing浏览器学术搜索入口_bing学术文献检索地址