[RN] React Native 使用 FlatList 实现九宫格布局 GridList
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的更多相关文章
- [RN] React Native 让 Flatlist  支持  选中多个值,并获取所选择的值
		
React Native 让 Flatlist 支持 选中多个值,并获取所选择的值 实现效果如下: 实现代码: import React, {Component} from 'react'; im ...
 - [RN] React Native 使用 FlatList 和 ScrollView 的下拉刷新问题
		
React Native 使用 FlatList 和 ScrollView 实现 下拉刷新时,RefreshControl 控件不起作用, 后来经查明,原来 RefreshControl 要加在 Sc ...
 - [RN] React Native 实现 FlatList上拉加载
		
FlatList可以利用官方组件 RefreshControl实现下拉刷新功能,但官方没有提供相应的上拉加载的组件,因此在RN中实现上拉加载比下拉刷新要复杂一点. 不过我们仍可以通过FlatList ...
 - React Native填坑之旅--布局篇
		
代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...
 - React Native之FlatList的介绍与使用实例
		
React Native之FlatList的介绍与使用实例 功能简介 FlatList高性能的简单列表组件,支持下面这些常用的功能: 完全跨平台. 支持水平布局模式. 行组件显示或隐藏时可配置回调事件 ...
 - React Native 学习(三)之 FlexBox 布局
		
React Native 学习(三)之 FlexBox 布局
 - [RN] React Native 实现图片预览
		
[RN] React Native 实现图片预览 效果预览: 代码如下: 'use strict'; import React, {Component} from 'react'; import {I ...
 - [RN] React Native  常见基本问题归纳总结
		
[RN] React Native 常见基本问题归纳总结 本问题总结涉及到版本为: "react": "16.8.3","react-native& ...
 - [RN] React Native 关闭所有黄色警告
		
[RN] React Native 关闭所有黄色警告 console.ignoredYellowBox = ['Warning: BackAndroid is deprecated. Please u ...
 
随机推荐
- Wampserver图标黄色解决
			
本文章是参考了该网址https://jingyan.baidu.com/article/48b37f8d0a02811a6564887b.html 安装了Wampserver后,并对httped.co ...
 - 【题解】Luogu CF1172B Nauuo and Circle
			
原题传送门 题意:在圆上有n个节点(珂以构成凸多边形),让你给节点编号,使得将题目给你的边(一棵树)没有交叉 我们钦定1为这个树的根节点.任意节点\(x\)的一颗子树的点应该是圆弧上连续的一段(我也不 ...
 - Java调用Http/Https接口(7,end)--WebClient调用Http/Https接口
			
WebClient是Spring提供的非阻塞.响应式的Http客户端,提供同步及异步的API,将会代替RestTemplate及AsyncRestTemplate.文中所使用到的软件版本:Java 1 ...
 - 2019 魔域java面试笔试题 (含面试题解析)
			
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.魔域等公司offer,岗位是Java后端开发,因为发展原因最终选择去了魔域,入职一年时间了,也成为了面试官,之 ...
 - crunch制作字典
			
安装 安装crunch sudo apt-get install crunch 语法 crunch <min> max<max> <characterset> -t ...
 - java-Java实现mysql事务处理操作
			
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 并非任意的对数据库的操作序列都是数据库事务.数据库事务拥有以下四个特性,习惯上被称之为ACID特性. ...
 - 【监控】jvisualvm之jmx远程连接 jar启动应用
			
一.Java -jar启动添加如下参数就可以了 -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.su ...
 - Pthon魔术方法(Magic Methods)-容器相关方法
			
Pthon魔术方法(Magic Methods)-容器相关方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.容器相关方法汇总 __len__: 内建函数len(),返回对象的 ...
 - 快速部署ldap服务
			
快速部署ldap服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LDAP概述 .什么是目录服务 ()目录是一类为了浏览和搜索数据二十几的特殊的数据库,例如:最知名的的微软公 ...
 - php string常用函数
			
<?php $a[]='a'; $a[]='b'; $a[]='C'; echo "</br>"; /* implode — 将一个一维数组的值转化为字符串 说明 ...