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。

renderItemrenderSectionHeaderでそれぞれの要素をどう描画するか指定しています。今回はサボって<View>使ってますが、コンポーネント使っても良さそう。

もうすぐワールドカップですね。