Skip to main content
Version: 2.x

Masonry Layout

Masonry Layout allows you to create a grid of items with different heights. It is a great way to display a collection of images with different sizes.

FlashList with masonry prop (v2)​

In v2, masonry layout is enabled using the masonry prop on FlashList.

import React from "react";
import { View, Text } from "react-native";
import { FlashList } from "@shopify/flash-list";
import { DATA } from "./data";

const MyMasonryList = () => {
return (
<FlashList
data={DATA}
masonry
numColumns={2}
renderItem={({ item }) => <Text>{item.title}</Text>}
/>
);
};

With overrideItemLayout​

When you want to customize item layout (such as setting different spans), you can use overrideItemLayout:

import React from "react";
import { View, Text, Image } from "react-native";
import { FlashList } from "@shopify/flash-list";

interface MasonryItem {
id: string;
title: string;
height: number;
span: number; // Number of columns this item should span
imageUrl: string;
}

const MyMasonryList = () => {
return (
<FlashList
data={data}
masonry
numColumns={3}
overrideItemLayout={(layout, item) => {
// Set the span based on the item's span property
layout.span = item.span;
// Note: In v2, size estimates are no longer needed in overrideItemLayout
// The actual height is determined by the rendered component
}}
renderItem={({ item }) => (
<View style={{ backgroundColor: "#f0f0f0", margin: 4 }}>
<Image source={{ uri: item.imageUrl }} style={{ flex: 1 }} />
<Text>{item.title}</Text>
</View>
)}
keyExtractor={(item) => item.id}
/>
);
};

optimizeItemArrangement prop​

optimizeItemArrangement?: boolean;

When enabled with masonry layout, this will try to reduce differences in column height by modifying item order. Default is true.

Migration from v1​

If you're migrating from v1's MasonryFlashList, here are the key changes:

  1. Use FlashList with masonry prop instead of MasonryFlashList
  2. overrideItemLayout no longer needs size estimates - only use it for setting layout.span
  3. getColumnFlex is not supported in v2 masonry layout
  4. Item heights are determined by actual rendered component rather than estimates