React Native 使用 FlatList 实现九宫格布局

先看图片演示实例:

本文以图片列表为例,实现九宫格布局!

主要有两种方法:

1)方法一:

利用FlatList的

numColumns ={} // 一行2个

2)方法二:

利用 FlatList的

contentContainerStyle={styles.listViewStyle}

其中样式如下:

listViewStyle: {
// 主轴方向
flexDirection: 'row',
// 一行显示不下,换一行
flexWrap: 'wrap',
// 侧轴方向
alignItems: 'center', // 必须设置,否则换行不起作用
},

当然,有一个重要的前提是,列表中的元素宽度 当然也要设置为宽度的 1/N,

看实际使用例子代码:

import React, {Component} from 'react';
import {FlatList, ActivityIndicator, Image, RefreshControl, Text, TouchableHighlight, View} from 'react-native';
import Dimensions from 'Dimensions'; import styles from '../../style/ImageStyle';
import ArrUtil from '../../util/ArrUtil';
import HttpRequest from '../../common/HttpRequest'; const baseUrl = 'https://raw.githubusercontent.com/wukong1688/RN-AppNews/master/apk/data/image_list_'; const screenWidth = Dimensions.get('window').width; let pageNo = ;//当前第几页
let totalPage = ;//总的页数 /**
* 新闻主页
*/
class ImagePage extends Component {
constructor(props) {
super(props);
//在这里定义json返回的key
this.state = {
//下拉刷新,上拉加载
isRefreshing: true, //下拉刷新标记
isLoading: false, //上拉加载标记 //data数据
resultJson: null,
error_code: '',
reason: '',
data: {}, //网络请求状态
error: false,
errorInfo: "", showFoot: , // 控制foot, 0:隐藏footer 1:已加载完成,没有更多数据 2 :显示加载中
}
} componentDidMount() {
pageNo = ; //切换tab时 pageNo 也要归零
this.fetchData(baseUrl + '0.json', ); //默认从0页数据开始读
} fetchData(url, pageNo) {
const opts = {
method: 'GET',
headers: HttpRequest.getHeaders(),
};
fetch(url, opts)
.then((res) => {
return res.json();
})
.then((response) => {
this.setData(response);
})
.catch((error) => {
alert(error);
// console.error(error);
})
.done();
} setData(response){
let foot = ;
if (pageNo >= totalPage) {
foot = ;//listView底部显示没有更多数据了
} let dataRes = [];
let responseData = ArrUtil.shuffle(response.results);
if (this.state.isRefreshing) { //刷新,以前的数据全部清掉
dataRes = responseData;
} else { //加载,数据追加到后面
dataRes = this.state.data.concat(responseData);
} this.setState({
isRefreshing: false,
isLoading: false, showFoot: foot, data: dataRes,
});
} //下拉刷新
_onRefresh(type) {
this.setState({
showFoot: ,
isRefreshing: true
});
pageNo = ; //刷新时,页码归0
this.fetchData(baseUrl + type + '.json', type);
} //列表点击事件
itemClick(item, index) {
this.props.navigation.navigate('ImageDetail', {
title: item.desc,
url: item.url,
})
} //FlatList的key
_keyExtractor = (item, index) => index.toString(); //子item渲染
_renderItem = ({item, index}) => {
let w = screenWidth * 0.5 - 7;
let h = screenWidth * 0.65 - 7;
let style = styles.itemPadding; return ( <TouchableHighlight
key={item._id}
style={style}
underlayColor={'rgba(255,255,255,0.5)'}
onPress={this.itemClick.bind(this, item, index)}
>
<Image
defaultSource={require('../../res/image_icon.png')}
source={{uri: item.url}} style={{height: h, width: w}}
resizeMethod="resize"
/>
</TouchableHighlight> )
}; //列表分割线
_itemDivide = () => {
return (
<View style={{height: }}/>
)
}; _renderFooter() {
if (this.state.showFoot === ) {
return HttpRequest.renderMoreDataEmptyView();
} else if (this.state.showFoot === ) {
return HttpRequest.renderMoreDataLoadingView();
} else if (this.state.showFoot === ) {
return HttpRequest.renderMoreDataNoneView();
}
} _onEndReached() {
//如果是正在加载中或没有更多数据了,则返回
if (this.state.showFoot != ) {
return;
} //如果当前页大于或等于总页数,那就是到最后一页了,返回
if ((pageNo != ) && (pageNo >= totalPage)) {
return;
} else {
pageNo++;
}
//底部显示正在加载更多数据
this.setState({
showFoot: ,
isLoading: true,
});
//获取数据
this.fetchData(baseUrl + pageNo + '.json', pageNo);
} render() {
//第一次加载等待的view
if (this.state.isRefreshing && !this.state.error) {
return HttpRequest.renderLoadingView();
} else if (this.state.error) {
//请求失败view
return HttpRequest.renderErrorView(this.state.error);
}
//加载数据
return this.renderData();
} renderData() {
return ( <FlatList
data={this.state.data}
keyExtractor={this._keyExtractor}
renderItem={this._renderItem}
ItemSeparatorComponent={this._itemDivide} // 方法1)
// numColumns ={2} // 一行2个 // 方法2)
contentContainerStyle={styles.listViewStyle} //下拉刷新
refreshControl={
<RefreshControl
refreshing={this.state.isRefreshing}
onRefresh={this._onRefresh.bind(this, )}
/>
} //上拉加载
ListFooterComponent={this._renderFooter.bind(this)}
onEndReached={this._onEndReached.bind(this)}
onEndReachedThreshold={}
/> );
} } module.exports = ImagePage;

样式:

listViewStyle: {
// 主轴方向
flexDirection: 'row',
// 一行显示不下,换一行
flexWrap: 'wrap',
// 侧轴方向
alignItems: 'center', // 必须设置,否则换行不起作用
},

参考:

https://blog.csdn.net/a_zhon/article/details/78137936

本博客地址: wukong1688

本文原文地址:https://www.cnblogs.com/wukong1688/p/10851764.html

转载请著名出处!谢谢~~

[RN] React Native 使用 FlatList 实现九宫格布局 GridList的更多相关文章

  1. [RN] React Native 让 Flatlist 支持 选中多个值,并获取所选择的值

    React Native 让 Flatlist  支持  选中多个值,并获取所选择的值 实现效果如下: 实现代码: import React, {Component} from 'react'; im ...

  2. [RN] React Native 使用 FlatList 和 ScrollView 的下拉刷新问题

    React Native 使用 FlatList 和 ScrollView 实现 下拉刷新时,RefreshControl 控件不起作用, 后来经查明,原来 RefreshControl 要加在 Sc ...

  3. [RN] React Native 实现 FlatList上拉加载

     FlatList可以利用官方组件 RefreshControl实现下拉刷新功能,但官方没有提供相应的上拉加载的组件,因此在RN中实现上拉加载比下拉刷新要复杂一点. 不过我们仍可以通过FlatList ...

  4. React Native填坑之旅--布局篇

    代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...

  5. React Native之FlatList的介绍与使用实例

    React Native之FlatList的介绍与使用实例 功能简介 FlatList高性能的简单列表组件,支持下面这些常用的功能: 完全跨平台. 支持水平布局模式. 行组件显示或隐藏时可配置回调事件 ...

  6. React Native 学习(三)之 FlexBox 布局

    React Native 学习(三)之 FlexBox 布局

  7. [RN] React Native 实现图片预览

    [RN] React Native 实现图片预览 效果预览: 代码如下: 'use strict'; import React, {Component} from 'react'; import {I ...

  8. [RN] React Native 常见基本问题归纳总结

    [RN] React Native  常见基本问题归纳总结 本问题总结涉及到版本为: "react": "16.8.3","react-native& ...

  9. [RN] React Native 关闭所有黄色警告

    [RN] React Native 关闭所有黄色警告 console.ignoredYellowBox = ['Warning: BackAndroid is deprecated. Please u ...

随机推荐

  1. JZOJ5833 永恒

    题目大意 给你一个树,每个节点上有有一个部落,以及部落的人数,要你求出每个节点的子树里面人数最多的部落是哪一个(人数相同部落编号最小的). 思路 全网第一篇分治题解 考虑树的dfs序,然后分治处理,每 ...

  2. C#泛型集合之——队列与堆栈

    队列与堆栈基础 队列 1.操作: (1)创建及初始化: Queue<类型> 队列名 =new Queue<类型>()://空队列,无元素 Queue<类型> 队列名 ...

  3. python 跨目录访问文件

    1.同级.同目录的文件之间的访问 有这样一个目录结构 假如,in_A.py 这个文件想调用 hello_world.py 中的函数怎么办呢? --->>>  import 只需在 i ...

  4. 手写MQ框架(一)-准备启程

    一.背景 很久以前写了DAO框架和MVC框架,前段时间又重写了DAO框架-GDAO(手写DAO框架(一)-从“1”开始,源码:https://github.com/shuimutong/gdao.gi ...

  5. HttpClient实战三:Spring整合HttpClient连接池

    简介 在微服务架构或者REST API项目中,使用Spring管理Bean是很常见的,在项目中HttpClient使用的一种最常见方式就是:使用Spring容器XML配置方式代替Java编码方式进行H ...

  6. Java 单例类

    单例类:该类只能创建一个实例,或者说内存中只有一个实例,该类的对象引用的都是这个实例. 示例: package my_package; //定义一个单例类 class Singleton{ //使用一 ...

  7. 【Python】模块和包

    模块 模块的概念 1. 每一个以扩展名 `py` 结尾的 `Python` 源代码文件都是一个 模块 2. 模块名 同样也是一个 标识符,需要符合标识符的命名规则 3. 在模块中定义的 全局变量 .函 ...

  8. java Excel文件流输出(后台)没有下载提示

    /**方案: *1. *问题源头应该是前端用的是ajax方式请求路径,要想出现下载Excel的弹窗,我个人理解应该是等同于重新打开一个窗口,而ajax默认不动页面直接将值返回,所以没有提升下载. *解 ...

  9. 【转】高性能网络编程5--IO复用与并发编程

    对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接.同时处理 ...

  10. 27.centos7基础学习与积累-013-文件和目录的权限

    从头开始积累centos7系统运用 大牛博客: https://blog.51cto.com/yangrong/p5 https://blog.oldboyedu.com/ 文件的权限 rw-r--r ...