首頁 > web前端 > js教程 > ListView實作九宮格效果案例

ListView實作九宮格效果案例

巴扎黑
發布: 2017-08-06 15:08:51
原創
1194 人瀏覽過

本篇文章主要介紹了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確認網格數量


##
<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={[&#39;#ff0000&#39;, &#39;#00ff00&#39;, &#39;#0000ff&#39;]}  
      enabled={true}  
      />  
    }  
   />
登入後複製

2,設定每個網格的寬度樣式


itemLayout:{  
  flex:1,  
  width:Util.size.width/3,  
  height:Util.size.width/3,  
  alignItems:&#39;center&#39;,  
  justifyContent:&#39;center&#39;,  
  borderWidth: Util.pixel,  
  borderColor: &#39;#eaeaea&#39;  
 },
登入後複製

3,設定contentContainerStyle對應屬性

grid: {  
  justifyContent: &#39;space-around&#39;,  
  flexDirection: &#39;row&#39;,  
  flexWrap: &#39;wrap&#39;  
 },
登入後複製

這裡要說明下,由於ListView的預設方向是縱向的,所以需要設定ListView的contentContainerStyle屬性,加入flexDirection:'row'。其次,ListView在同一行顯示,而且透過flexWrap:'wrap'設定自動換行。

註:flexWrap屬性:wrap、nowrap,wrap:空間不足的情況下自動換行,nowrap:空間不足,壓縮容器,不會自動換行。

以下是完整程式碼:


 import React, { Component } from &#39;react&#39;; 
import { 
  AppRegistry, 
  StyleSheet, 
  Text, 
  View, 
  ListView, 
  Image, 
  TouchableOpacity, // 不透明触摸 
  AlertIOS 
} from &#39;react-native&#39;; 
 
// 获取屏幕宽度 
var Dimensions = require(&#39;Dimensions&#39;); 
const screenW = Dimensions.get(&#39;window&#39;).width; 
 
// 导入json数据 
var shareData = require(&#39;./shareData.json&#39;); 
 
// 一些常亮设置 
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(&#39;点击了&#39;)}} > 
        <View style={styles.innerViewStyle}> 
          <Image source={{uri:rowData.icon}} style={styles.iconStyle} /> 
          <Text>{rowData.title}</Text> 
        </View> 
      </TouchableOpacity> 
    ); 
  }, 
}); 
 
const styles = StyleSheet.create({ 
  listViewStyle:{ 
    // 主轴方向 
    flexDirection:&#39;row&#39;, 
    // 一行显示不下,换一行 
    flexWrap:&#39;wrap&#39;, 
    // 侧轴方向 
    alignItems:&#39;center&#39;, // 必须设置,否则换行不起作用 
  }, 
 
  innerViewStyle:{ 
    width:cellWH, 
    height:cellWH, 
    marginLeft:vMargin, 
    marginTop:hMargin, 
    // 文字内容居中对齐 
    alignItems:&#39;center&#39; 
  }, 
 
  iconStyle:{ 
    width:80, 
    height:80, 
  }, 
 
}); 
 
AppRegistry.registerComponent(&#39;ListViewDemo&#39;, () => ListViewDemo);
登入後複製

效果如圖(資料來源本身加)

#

以上是ListView實作九宮格效果案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板