FlatListを使用して、2つの列に項目のリストを表示しています
<FlatList style={{margin:5}}
data={this.state.items}
numColumns={2}
keyExtractor={(item, index) => item.id }
renderItem={(item) => <Card image={item.item.gallery_image_url} text={item.item.name}/> }
/>
カードコンポーネントは、いくつかのスタイルを持つ単なるビューです。
<View style={{ flex: 1, margin: 5, backgroundColor: '#ddd', height: 130}} ></View>
正常に機能していますが、アイテムの数が奇数の場合、最後の行にはアイテムが1つしか含まれず、そのアイテムは画面の幅いっぱいまで広がります。
アイテムを他のアイテムと同じ幅に設定するにはどうすればよいですか?
ここで試すことができるいくつかのことがあります。
A)カードの事前に定義された幅を設定する(設定した高さと同じかもしれませんか?)。次に、alignItems
を使用して、カードを中央または左に配置することができます-ここでどちらを使用するか不明です。
B)偶数枚のカードがある場合、このスペースを埋めるために最後に空のビューを追加できます。この方法は非常に不格好ですが、将来の要素のためにスペースを空けるときに役立ちます。
C)単にalignItems: 'space-between
を使用します。これを使用してアイテムをセンタリングしますが、幅を定義するか、flex:0.5
のようなものを使用する必要があります。
この状況のコンテキストを伝えるのは難しいので、flexboxをさらに調査して、これを支援することをお勧めします。上記の方法が役立つと思いますが、そうでない場合は、ここにいくつかのリンクがあります-
番目のリンクリンク切れ
お役に立てれば。さらに説明が必要な場合は、質問してください
あなたの場合はflex:1/2を使用してください
したがって:itemにはflexの1 /(列の数)が必要です3列の場合、アイテムにはflex:1/3が必要です
Dimensionsを使用してデバイスの現在の幅を取得し、レンダリングする列の数に基づいていくつかの計算を行い、マージンを差し引いて、minWidthとmaxWidthとして設定することができます。
例えば:
const {height, width} = Dimensions.get('window');
const itemWidth = (width - 15) / 2;
<View style={{ flex: 1, margin: 5, backgroundColor: '#ddd', minWidth: {this.itemWidth}, maxWidth: {this.itemWidth}, height: 130}} ></View>
FlatList
を列で等間隔にスタイルする最もクリーンな方法です。 <FlatList style={{margin:5}}
numColumns={2} // set number of columns
columnWrapperStyle={style.row} // space them out evenly
data={this.state.items}
keyExtractor={(item, index) => item.id }
renderItem={(item) => <Card image={item.item.gallery_image_url} text={item.item.name}/> }
/>
const style = StyleSheet.create({
row: {
flex: 1,
justifyContent: "space-around"
}
});
その理由は、カードのスタイルがflex: 1
であるため、残っているすべてのスペースを拡張しようとします。カードのスタイルにmaxWidth: '50%'
を追加することで修正できます
<View style={{ flex: 1, margin: 5, backgroundColor: '#ddd', height: 130, maxWidth: '50%'}} ></View>