[FlatList] Scrolling issues with FlatList when rows are variable height
See original GitHub issueI’m using a FlatList
where each row can be of different height (and may contain a mix of both text and zero or more images from a remote server).
I cannot use getItemLayout
because I don’t know the height of each row (nor the previous ones) to be able to calculate.
The problem I’m facing is that I cannot scroll to the end of the list (it jumps back few rows when I try) and I’m having issues when trying to use scrollToIndex
(I’m guessing due to the fact I’m missing getItemLayout).
I wrote a sample project to demonstrate the problem (simply try to scroll to the end with your finger - it won’t allow you)
import React, { Component } from 'react';
import { AppRegistry, StyleSheet, Text, View, Image, FlatList } from 'react-native';
import autobind from 'autobind-decorator';
const items = count => [...Array(count)].map((v, i) => ({
key: i,
index: i,
image: 'https://dummyimage.com/600x' + (((i % 4) + 1) * 50) + '/000/fff',
}));
class RemoteImage extends Component {
constructor(props) {
super(props);
this.state = {
style: { flex: 1, height: 0 },
};
}
componentDidMount() {
Image.getSize(this.props.src, (width, height) => {
this.image = { width, height };
this.onLayout();
});
}
@autobind
onLayout(event) {
if (event) {
this.layout = {
width: event.nativeEvent.layout.width,
height: event.nativeEvent.layout.height,
};
}
if (!this.layout || !this.image || !this.image.width)
return;
this.setState({
style: {
flex: 1,
height: Math.min(this.image.height,
Math.floor(this.layout.width * this.image.height / this.image.width)),
},
});
}
render() {
return (
<Image
onLayout={this.onLayout}
source={{ uri: this.props.src }}
style={this.state.style}
resizeMode='contain'
/>
);
}
}
class Row extends Component {
@autobind
onLayout({ nativeEvent }) {
let { index, item, onItemLayout } = this.props;
let height = Math.max(nativeEvent.layout.height, item.height || 0);
if (height != item.height)
onItemLayout(index, { height });
}
render() {
let { index, image } = this.props.item;
return (
<View style={[styles.row, this.props.style]}>
<Text>Header {index}</Text>
<RemoteImage src = { image } />
<Text>Footer {index}</Text>
</View>
);
}
}
export default class FlatListTest extends Component {
constructor(props) {
super(props);
this.state = { items: items(50) };
}
@autobind
renderItem({ item, index }) {
return <Row
item={item}
style={index&1 && styles.row_alternate || null}
onItemLayout={this.onItemLayout}
/>;
}
@autobind
onItemLayout(index, props) {
let items = [...this.state.items];
let item = { ...items[index], ...props };
items[index] = { ...item, key: [item.height, item.index].join('_') };
this.setState({ items });
}
render() {
return (
<FlatList
ref={ref => this.list = ref}
data={this.state.items}
renderItem={this.renderItem}
/>
);
}
}
const styles = StyleSheet.create({
row: {
padding: 5,
},
row_alternate: {
backgroundColor: '#bbbbbb',
},
});
AppRegistry.registerComponent('FlatListTest', () => FlatListTest);
Issue Analytics
- State:
- Created 6 years ago
- Reactions:19
- Comments:62 (22 by maintainers)
Top Results From Across the Web
Scrolling issues with FlatList when rows are variable height
The problem I'm facing is that I cannot scroll to the end of the list (it jumps back few rows when I try)...
Read more >Scrolling issues with FlatList when rows are variable height
I'm using a FlatList where each row can be of different height (and may contain a mix of both text and zero or...
Read more >FlatList not scrolling due to items not having a fixed height- ...
Coding example for the question FlatList not scrolling due to items not having a fixed ... Scrolling issues with FlatList when rows are...
Read more >Displaying a List in React Native: Map Method or FlatList ...
FlatList is a React Native component that provides scrolling features by default. The FlatList component comes with: Header, Footer, Horizontal scrolling, ...
Read more >Optimizing Flatlist Configuration
Pros: Bigger windowSize will result in less chance of seeing blank space while scrolling. On the other hand, smaller windowSize will result in ......
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Hi there! This issue is being closed because it has been inactive for a while. Maybe the issue has been fixed in a recent release, or perhaps it is not affecting a lot of people. Either way, we’re automatically closing issues after a period of inactivity. Please do not take it personally!
If you think this issue should definitely remain open, please let us know. The following information is helpful when it comes to determining if the issue should be re-opened:
If you would like to work on a patch to fix the issue, contributions are very welcome! Read through the contribution guide, and feel free to hop into #react-native if you need help planning your contribution.
you should not close the issue unless it’s fixed , I’m having the same issue , I’m using a custom TreeView based on Flatlists , when you click on item the sub item will be visible then the height will be dynamic and the scrollToIndex doesn’t work properly!
There is no scrollToItem? that might resolve my problem