Search Bar Filter for List View
This is an example to Make Search Bar Filter for ListView Data in React Native. Basically, We will make a React Native FlatList with real-time searching ability. If we have a Long list in the app then it is very inconvenient to search the required data by scrolling the whole list.
Let’s take an example of E-Commerce which has the number of products and we have to choose our required product. You can imagine how tough it will be to search for a product by scrolling. So at this point, we need a Search Bar Filter on Listview so that we can easily search the required data and can save time.
In this Example of React Native Search Bar Filter on Listview, we are going to use a FlatList with a TextInput to work as the search bar.
For Real-Time Searching in ListView using Search Bar Filter
The logic is simple
- We will load the list from the network call and then show it to the user.
- The user can search the data by entering the text in TextInput.
- After inserting the text
SearchFilterFunction
will be called - We will compare the list data with the inserted data and will make a new Data source.
- We will update the data source attached to the ListView.
- It will re-render the list and the user will be able to see the filtered data.
const searchFilterFunction = (text) => {
// Check if searched text is not blank
if (text) {
// Inserted text is not blank
// Filter the masterDataSource and update FilteredDataSource
const newData = masterDataSource.filter(
function (item) {
// Applying filter for the inserted text in search bar
const itemData = item.title
? item.title.toUpperCase()
: ''.toUpperCase();
const textData = text.toUpperCase();
return itemData.indexOf(textData) > -1;
}
);
setFilteredDataSource(newData);
setSearch(text);
} else {
// Inserted text is blank
// Update FilteredDataSource with masterDataSource
setFilteredDataSource(masterDataSource);
setSearch(text);
}
};
To Make a React Native App
Getting started with React Native will help you to know more about the way you can make a React Native project. We are going to use react native command line interface to make our React Native App.
If you have previously installed a global react-native-cli package, please remove it as it may cause unexpected issues:
npm uninstall -g react-native-cli @react-native-community/cli
Run the following commands to create a new React Native project
npx react-native init ProjectName
If you want to start a new project with a specific React Native version, you can use the --version argument:
npx react-native init ProjectName --version X.XX.X
Note If the above command is failing, you may have old version of react-native
or react-native-cli
installed globally on your pc. Try uninstalling the cli and run the cli using npx.
This will make a project structure with an index file named App.js in your project directory.
Code
Open App.js in any code editor and replace the code with the following code
App.js
// Searching using Search Bar Filter in React Native List View
// https://aboutreact.com/react-native-search-bar-filter-on-listview/
// import React in our code
import React, {useState, useEffect} from 'react';
// import all the components we are going to use
import {
SafeAreaView,
Text,
StyleSheet,
View,
FlatList,
TextInput,
} from 'react-native';
const App = () => {
const [search, setSearch] = useState('');
const [filteredDataSource, setFilteredDataSource] = useState([]);
const [masterDataSource, setMasterDataSource] = useState([]);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/posts')
.then((response) => response.json())
.then((responseJson) => {
setFilteredDataSource(responseJson);
setMasterDataSource(responseJson);
})
.catch((error) => {
console.error(error);
});
}, []);
const searchFilterFunction = (text) => {
// Check if searched text is not blank
if (text) {
// Inserted text is not blank
// Filter the masterDataSource
// Update FilteredDataSource
const newData = masterDataSource.filter(
function (item) {
const itemData = item.title
? item.title.toUpperCase()
: ''.toUpperCase();
const textData = text.toUpperCase();
return itemData.indexOf(textData) > -1;
});
setFilteredDataSource(newData);
setSearch(text);
} else {
// Inserted text is blank
// Update FilteredDataSource with masterDataSource
setFilteredDataSource(masterDataSource);
setSearch(text);
}
};
const ItemView = ({item}) => {
return (
// Flat List Item
<Text
style={styles.itemStyle}
onPress={() => getItem(item)}>
{item.id}
{'.'}
{item.title.toUpperCase()}
</Text>
);
};
const ItemSeparatorView = () => {
return (
// Flat List Item Separator
<View
style={{
height: 0.5,
width: '100%',
backgroundColor: '#C8C8C8',
}}
/>
);
};
const getItem = (item) => {
// Function for click on an item
alert('Id : ' + item.id + ' Title : ' + item.title);
};
return (
<SafeAreaView style={{flex: 1}}>
<View style={styles.container}>
<TextInput
style={styles.textInputStyle}
onChangeText={(text) => searchFilterFunction(text)}
value={search}
underlineColorAndroid="transparent"
placeholder="Search Here"
/>
<FlatList
data={filteredDataSource}
keyExtractor={(item, index) => index.toString()}
ItemSeparatorComponent={ItemSeparatorView}
renderItem={ItemView}
/>
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
backgroundColor: 'white',
},
itemStyle: {
padding: 10,
},
textInputStyle: {
height: 40,
borderWidth: 1,
paddingLeft: 20,
margin: 5,
borderColor: '#009688',
backgroundColor: '#FFFFFF',
},
});
export default App;
To Run the React Native App
Open the terminal again and jump into your project using.
cd ProjectName
1. Start Metro Bundler
First, you will need to start Metro, the JavaScript bundler that ships with React Native. To start Metro bundler run following command:
npx react-native start
Once you start Metro Bundler it will run forever on your terminal until you close it. Let Metro Bundler run in its own terminal. Open a new terminal and run the application.
2. Start React Native Application
To run the project on an Android Virtual Device or on real debugging device:
npx react-native run-android
or on the iOS Simulator by running (macOS only)
npx react-native run-ios
Output Screenshots
Output in Online Emulator
This is how you can make a search bar filter on ListView in React Native.
If you want to explore more then you can also see the below example for Searching in List using Search Bar provided by react-native-elements
.
Searching in List using Search Bar provided by react-native-elements
I have mentioned that searching is very important if we have a long list. It provides great user experience and control over the data to the App user. To make a React Native Search Bar, we can also use SearchBar
component provided by react-native-elements
.
Installation of Dependencies
To use SearchBar
we have to install @rneui/themed @rneui/base
and react-native-vector-icons
dependencies.
For installation open the terminal and jump into your project using.
cd ProjectName
Run the following command.
npm install @rneui/themed @rneui/base --save
npm install react-native-vector-icons --save
Please visit Example to Use React Native Vector Icons for further instructions to complete the installation of Vector Icons.
CocoaPods Installation
Now we need to install pods
npx pod-install
Material Icons
React Native elements internally uses material Icons which you need to add in your info.plist else you will get “Error: Unrecognized font family Material Design“. Once you are done with the pod installation you need to add the following in your {ProjectName}/ios/{ProjectName}/Info.plist
<key>UIAppFonts</key>
<array>
<string>MaterialIcons.ttf</string>
</array>
Code
Now Open App.js in any code editor and replace the code with the following code
App.js
// Searching using Search Bar Filter in React Native List View
// https://aboutreact.com/react-native-search-bar-filter-on-listview/
// import React in our code
import React, {useState, useEffect} from 'react';
// import all the components we are going to use
import {
SafeAreaView,
Text,
StyleSheet,
View,
FlatList
} from 'react-native';
import {SearchBar} from 'react-native-elements';
const App = () => {
const [search, setSearch] = useState('');
const [filteredDataSource, setFilteredDataSource] = useState([]);
const [masterDataSource, setMasterDataSource] = useState([]);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/posts')
.then((response) => response.json())
.then((responseJson) => {
setFilteredDataSource(responseJson);
setMasterDataSource(responseJson);
})
.catch((error) => {
console.error(error);
});
}, []);
const searchFilterFunction = (text) => {
// Check if searched text is not blank
if (text) {
// Inserted text is not blank
// Filter the masterDataSource
// Update FilteredDataSource
const newData = masterDataSource.filter(function (item) {
const itemData = item.title
? item.title.toUpperCase()
: ''.toUpperCase();
const textData = text.toUpperCase();
return itemData.indexOf(textData) > -1;
});
setFilteredDataSource(newData);
setSearch(text);
} else {
// Inserted text is blank
// Update FilteredDataSource with masterDataSource
setFilteredDataSource(masterDataSource);
setSearch(text);
}
};
const ItemView = ({item}) => {
return (
// Flat List Item
<Text
style={styles.itemStyle}
onPress={() => getItem(item)}>
{item.id}
{'.'}
{item.title.toUpperCase()}
</Text>
);
};
const ItemSeparatorView = () => {
return (
// Flat List Item Separator
<View
style={{
height: 0.5,
width: '100%',
backgroundColor: '#C8C8C8',
}}
/>
);
};
const getItem = (item) => {
// Function for click on an item
alert('Id : ' + item.id + ' Title : ' + item.title);
};
return (
<SafeAreaView style={{flex: 1}}>
<View style={styles.container}>
<SearchBar
round
searchIcon={{size: 24}}
onChangeText={(text) => searchFilterFunction(text)}
onClear={(text) => searchFilterFunction('')}
placeholder="Type Here..."
value={search}
/>
<FlatList
data={filteredDataSource}
keyExtractor={(item, index) => index.toString()}
ItemSeparatorComponent={ItemSeparatorView}
renderItem={ItemView}
/>
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
backgroundColor: 'white',
},
itemStyle: {
padding: 10,
},
});
export default App;
Output Screenshots of SearchBar component provided by react-native-elements
Output of SearchBar component provided by react-native-elements in Online Emulator
This is how you can add a search bar to filter a list. If you have any doubts or you want to share something about the topic you can comment below or contact us here. There will be more posts coming soon. Stay tuned!
Hope you liked it. 🙂
how to use this code in mysql database
For this, you have to make an API which will have the functionality to search the keyword from the MySQL database and from the SearchFilterFunction you have to call the API each time when the user enters any character.
Hello I am a newbie developer and i am creating this library book searching app using react native… i have this question : I want to search book names from firebase database and display on my screen. how can i do that? i created the search bar with the help of this article. Please Help ME! Thank You! ( Codes or Screenshots would be better since i am soooo new to react and development)
You need to integrate Firebase for that. Please wait I’ll update the example for the same.
Hi Snehal,
I have gone through almost all the concepts in aboutreact, all the examples and explanation is very clear and easily understandable. Its really helps the beginners to understand/learn react native quickly, thank you for your great work.
Thanks for your words. It will motivate me to do more 🙂
If the array is nested, how to solve it?
my search filter work fine, but i flatlist not render when i press any character,
help to render flatlist