Skip to content

jemise111/react-native-swipe-list-view

Repository files navigation

npm npm CI

react-native-swipe-list-view

<SwipeListView> is a vertical FlatList (or SectionList) with rows that swipe open and closed. It handles the expected native behavior: closing rows when the list scrolls or when another row is opened.

It also exports <SwipeRow> for using a swipeable row on its own.

📖 Full documentation: https://jessesessler.com/react-native-swipe-list-view/


v4

v4 is a full rewrite on TypeScript, react-native-gesture-handler v2, and react-native-reanimated v3 — gestures and animation now run on the UI thread. The component API is prop-for-prop compatible with v3 apart from a short list of breaking changes (new peer deps, removed dead ListView props, a changed swipeGestureEnded payload, and more).

Upgrading from v3? Read the Migration guide.

Installation

npm install react-native-swipe-list-view
npm install react-native-gesture-handler react-native-reanimated

react-native-gesture-handler and react-native-reanimated are peer dependencies (≥2.14.0 and ≥3.6.0). After installing them:

  1. Add the Reanimated Babel plugin (must be last in the list) to babel.config.js:

    module.exports = {
        presets: ['module:@react-native/babel-preset'],
        plugins: ['react-native-reanimated/plugin'],
    };
  2. Wrap your app root in GestureHandlerRootView:

    import { GestureHandlerRootView } from 'react-native-gesture-handler';
    
    export default function App() {
        return (
            <GestureHandlerRootView style={{ flex: 1 }}>
                {/* ... */}
            </GestureHandlerRootView>
        );
    }
  3. Rebuild the native app (both are native modules).

See the official setup guides for gesture-handler and reanimated.

Requirements: react ≥18, react-native ≥0.73.

Quick start

import { SwipeListView } from 'react-native-swipe-list-view';

// Each data item must have a `key`, or pass a `keyExtractor` to the list:
// https://reactnative.dev/docs/flatlist#keyextractor
const data = Array(20)
    .fill('')
    .map((_, i) => ({ key: `${i}`, text: `item #${i}` }));

function MyList() {
    return (
        <SwipeListView
            data={data}
            renderItem={(rowData, rowMap) => (
                <View style={styles.rowFront}>
                    <Text>I am {rowData.item.text} in a SwipeListView</Text>
                </View>
            )}
            renderHiddenItem={(rowData, rowMap) => (
                <View style={styles.rowBack}>
                    <Text>Left</Text>
                    <Text>Right</Text>
                </View>
            )}
            leftOpenValue={75}
            rightOpenValue={-75}
        />
    );
}

Touchable rows: if your row is a Touchable* with an onPress, make sure renderItem returns the Touchable as the topmost element, otherwise the press and the swipe gesture will conflict.

// Good
renderItem={data => (
    <TouchableHighlight onPress={doSomething}>
        <View><Text>{data.item.text}</Text></View>
    </TouchableHighlight>
)}

Component APIs

Guides

Example app

A managed Expo app under example/ showcases every feature: basic list, SectionList, per-row config, standalone SwipeRow, swipe-to-delete, swipe-value-driven UI (both the legacy onSwipeValueChange and the recommended swipeAnimatedValue approach), actions, manual close, and accessibility.

cd example
npm install
npx expo start

License

MIT

Releases

Packages

Used by

Contributors

Languages