Skip to content

RN Lez 14: FlatList Base

Docs: Using List Views, FlatList

  • Usare FlatList per liste performanti
  • Configurare data, renderItem, keyExtractor
  • Gestire stati vuoti

FlatList renderizza solo gli elementi visibili (virtualizzazione).

ScrollViewFlatList
RenderTUTTI gli elementiSOLO quelli visibili
Performance↓ con tanti elementi✅ sempre fluida
Quando usare< 10 elementiqualsiasi quantità
import { FlatList, Text, View, StyleSheet } from 'react-native';
const DATA = [
{ id: '1', nome: 'Mario' },
{ id: '2', nome: 'Sofia' },
{ id: '3', nome: 'Luca' },
];
export default function App() {
return (
<FlatList
data={DATA}
renderItem={({ item }) => (
<View style={styles.item}>
<Text>{item.nome}</Text>
</View>
)}
keyExtractor={item => item.id}
/>
);
}

const renderItem = ({ item, index, separators }) => {
// item = elemento corrente
// index = posizione (0, 1, 2...)
// separators = per personalizzare separatori
return (
<View style={styles.item}>
<Text style={styles.index}>{index + 1}.</Text>
<Text style={styles.nome}>{item.nome}</Text>
</View>
);
};

Fornisce una chiave unica per ogni elemento (ottimizzazione).

// Se l'id è stringa:
keyExtractor={item => item.id}
// Se l'id è number:
keyExtractor={item => item.id.toString()}
// Se non hai id, usa l'indice (NON consigliato se la lista cambia):
keyExtractor={(item, index) => index.toString()}

Cosa mostrare quando la lista è vuota.

<FlatList
data={items}
renderItem={renderItem}
ListEmptyComponent={() => (
<View style={styles.empty}>
<Text style={{ fontSize: 48 }}>📭</Text>
<Text style={styles.emptyText}>Nessun elemento</Text>
</View>
)}
/>

<FlatList
data={items}
renderItem={renderItem}
ListHeaderComponent={ // in testa alla lista
<Text style={styles.header}>I miei contatti</Text>
}
ListFooterComponent={ // in fondo
<Text style={styles.footer}>Fine lista</Text>
}
ItemSeparatorComponent={ // tra un elemento e l'altro
() => <View style={styles.separatore} />
}
/>

type Contatto = {
id: string;
nome: string;
telefono: string;
};
const CONTATTI: Contatto[] = [
{ id: '1', nome: 'Mario Rossi', telefono: '345 1234567' },
{ id: '2', nome: 'Sofia Bianchi', telefono: '345 7654321' },
{ id: '3', nome: 'Luca Verdi', telefono: '345 9876543' },
];
export default function App() {
const renderItem = ({ item }: { item: Contatto }) => (
<View style={styles.card}>
<View style={styles.avatar}>
<Text style={styles.iniziale}>{item.nome[0]}</Text>
</View>
<View>
<Text style={styles.nome}>{item.nome}</Text>
<Text style={styles.tel}>{item.telefono}</Text>
</View>
</View>
);
return (
<View style={styles.container}>
<FlatList
data={CONTATTI}
renderItem={renderItem}
keyExtractor={item => item.id}
ItemSeparatorComponent={() => <View style={{ height: 8 }} />}
/>
</View>
);
}

PropDescrizione
dataArray di dati
renderItem({item, index}) => JSX
keyExtractoritem => item.id.toString()
ListEmptyComponentCosa mostrare se vuoto
ListHeaderComponentHeader fisso in testa
ItemSeparatorComponentSeparatore

Crea una FlatList di contatti:

  • Dati: nome, telefono, email
  • Ogni card: avatar con iniziale, nome, telefono, email
  • Separatore tra elementi
  • Messaggio “Nessun contatto” se lista vuota (prova con array [])