React Nativeでリストを表示するときはFlatListを使いますが、セクションに分かれているような場合にはSectionListを使います。
0.42まではどちらもFlatListで、結構頑張らないといけなかったのですが、0.34からFlatList, SectionListの2つが導入されました。メモリ使用やパフォーマンスなど色々な面でListViewに勝るようです。
FlatListはグループ分けのないリスト、SectionListはグループ分けのあるリストです。FlatListのデータは単にArrayであればよいですが、SectionListではデータやメタデータをオブジェクトにしたもののArrayになるのでちょっと複雑です(と言ってもListViewの頃に比べたらシンプル)
以下、一画面分の画面イメージとサンプルコード載せときます。あとで自分が困って検索する自信あるので、スニペット的に残しておきます。
1import React, { Component } from 'react';
2import {
3 Text,
4 View,
5 SectionList,
6 StatusBar,
7} from 'react-native';
8
9type Props = {};
10export default class App extends Component<Props> {
11 componentDidMount() {
12 StatusBar.setHidden(true);
13 }
14
15 renderItem({ item }) {
16 return (
17 <View
18 style={{
19 height: 40,
20 justifyContent: 'center',
21 borderTopWidth: 1,
22 borderTopColor: '#EAEAEA',
23 }}
24 >
25 <Text>{item}</Text>
26 </View>
27 );
28 }
29
30 renderSectionHeader({ section }) {
31 return (
32 <View
33 style={{
34 height: 28,
35 backgroundColor: '#F0F0F0',
36 justifyContent: 'center',
37 }}
38 >
39 <Text>{section.title}</Text>
40 </View>
41 );
42 }
43
44 render() {
45 return (
46 <SectionList
47 style={{ flex: 1 }}
48 keyExtractor={item => item}
49 renderItem={this.renderItem.bind(this)}
50 renderSectionHeader={this.renderSectionHeader.bind(this)}
51 sections={[
52 {
53 title: 'グループA',
54 data: ['ロシア', 'ウルグアイ', 'エジプト', 'サウジアラビア'],
55 },
56 {
57 title: 'グループB',
58 data: ['ポルトガル', 'スペイン', 'イラン', 'モロッコ'],
59 },
60 {
61 title: 'グループC',
62 data: ['フランス', 'ペルー', 'デンマーク', 'オーストラリア'],
63 },
64 {
65 title: 'グループD',
66 data: ['アルゼンチン', 'クロアチア','アイスランド', 'ナイジェリア'],
67 },
68 {
69 title: 'グループE',
70 data: ['ベルギー', 'スイス', 'コスタリカ', 'セルビア'],
71 },
72 {
73 title: 'グループF',
74 data: ['ドイツ', 'メキシコ', 'スウェーデン', '韓国'],
75 },
76 {
77 title: 'グループG',
78 data: ['ベルギー', 'イングランド', 'チュニジア', 'パナマ'],
79 },
80 {
81 title: 'グループH',
82 data: ['ポーランド', 'コロンビア', 'セネガル', '日本'],
83 },
84 ]}
85 />
86 );
87 }
88}
keyExtractorを忘れると警告がでます。というか大体忘れて警告が出て、なんだっけ?となる。Reactでkeyを渡す必要があるのと同じ理由でリスト内の各アイテムにkeyが必要です。そのkeyにdataの何を使うかを返す関数を渡しておけばOK。
renderItemやrenderSectionHeaderでそれぞれの要素をどう描画するか指定しています。今回はサボって<View>使ってますが、コンポーネント使っても良さそう。
もうすぐワールドカップですね。
