React Native
Why is my React Native ScrollView not scrolling on Android?
Check three layout problems. A parent view may have no bounded height, contentContainerStyle may use flex 1 where it needs flexGrow 1, or the ScrollView may sit inside another one that scrolls the same way, which on Android needs nestedScrollEnabled.
Updated October 31, 2026
A screen that looks right but won’t move under your finger is maddening, because nothing turns red and nothing shows up in the logs. Before you go looking for a bug in ScrollView, check the three layout problems below, since each fix is a small style change.
Why it happens
A ScrollView is a window of fixed height onto content that’s taller than the window. It scrolls only when both are true: the window has a height it can’t grow past, and the content inside is taller than that. Three things break one or the other.
- The ScrollView has no bounded height. According to React Native’s documentation, ScrollViews must have a bounded height, and forgetting to pass
flex: 1down the view stack is the common mistake. If any view above the ScrollView sizes itself to its content, the ScrollView grows to fit everything, and there’s nothing left to scroll. flex: 1is oncontentContainerStyle. In React Native,flex: 1meansflexGrow: 1,flexShrink: 1, andflexBasis: 0. On the content container, that lets the content shrink to the height of the window, so it never overflows.- A ScrollView is inside another one that scrolls the same way, such as a vertical list inside a vertical screen. On Android, the inner one needs
nestedScrollEnabled. That prop exists only on Android and isfalseby default, which is why the same screen can scroll fine on an iPhone.
How to fix it
-
Give every view above the ScrollView a bounded height. Putting
flex: 1on the screen’s root view and on each wrapper in between does it. -
Use
flexGrow: 1instead offlex: 1incontentContainerStyle. It fills the screen when the content is short and lets the content grow past the screen when it’s long:<View style={{ flex: 1 }}> <ScrollView contentContainerStyle={{ flexGrow: 1, padding: 16 }}>{/* content */}</ScrollView> </View> -
Turn on nested scrolling for a scroll view inside another one:
<ScrollView> <Header /> <ScrollView style={{ maxHeight: 300 }} nestedScrollEnabled> {items.map((item) => ( <Row key={item.id} item={item} /> ))} </ScrollView> </ScrollView>If the inner one is a long list, we’d skip the nesting altogether and use a single
FlatListas the screen’s only scroller, with the rest of the screen inListHeaderComponent, which also renders the list lazily. -
Check
scrollEnabled. If it comes from state or a prop and ends upfalse, the view can’t be scrolled by touch.
How you know it’s fixed
On an Android phone, you can swipe through the screen from top to bottom, including inside any inner list. If you’d like to check the layout directly, open the element inspector from the Dev Menu and tap the ScrollView. Its height should match the visible area, and its content should be taller.
If it still won’t scroll
Something may be sitting on top of the ScrollView and catching the touches, such as an absolutely positioned view that’s invisible. The element inspector shows which view is under your finger. If it’s an overlay that should let touches through, give it pointerEvents="box-none", so its children stay tappable and everything else reaches the ScrollView. And if only part of the content is reachable, look for a fixed height on a view inside the content, which caps how tall the content can get.
Ask the agent
If your app is in Draftbit, paste this into the agent, and it can read your code and make the change for you.
The ScrollView on my screen won't scroll on Android. Make sure every parent view has flex 1, replace flex 1 in contentContainerStyle with flexGrow 1, and add nestedScrollEnabled to any scroll view inside another one. Then test it on an Android phone.