When list become long its difficult to find items on list. So in this blog we will learn how to implement searchable FlatList in react native.

Import all required component as below.

import React, {Component} from 'react';
import {
SafeAreaView,
View,StyleSheet,
TouchableOpacity,
Text,
FlatList,
Alert} from 'react-native';
import Constants from 'expo-constants';
import {SearchBar} from 'react-native-elements';

Here SearchBar component using from 'react-native-elements' .

Lets first define an array of list for our FlatList

const data=[
{key:"1",title:"Android"},
{key:"2",title:"IOS"},
{key:"3",title:"React"},
{key:"4",title:"Node JS"},
{key:"5",title:"Java"},
{key:"6",title:"PHP"},
{key:"7",title:"Javascript"},
];

 

Now lets initialize  some state variable which will be use later.

constructor(){
super()
this.state={
data:data,
search:""
}
}


Now,  we need to add a search bar for FlatList so user can search the list . FlatList has a prop to add any custom component to its header which is useful as we’ll be adding a search component there.

renderHeader=()=>{
const { search } = this.state;
return(
<SearchBar
placeholder="Search Here"
lightTheme
onChangeText={text=>this.searchAction(text)}
autoCorrect={false}
value={search}
/>
)
}
searchAction=(text)=>{
const newData=data.filter(item=>{
const itemData=`${item.title.toUpperCase()}`;
const textData=text.toUpperCase();
return itemData.indexOf(textData) > -1;

});
this.setState({
data:newData,
search:text
});
}


In the above code snippet, seachAction function which will filter our existing list user input on seacrbar

So our flatList component will look like

<FlatList
data={this.state.data}
renderItem={({item})=>this.renderItem(item)}
keyExtractor={item=>item.key}
ListHeaderComponent={this.renderHeader}
>
FlatList>

Here ListHeaderComponet is the  property to add seacrh bar at  top of the FlatList.

So our complete component will be as bellow

import React, {Component} from 'react';
import {
SafeAreaView,
View,StyleSheet,
TouchableOpacity,
Text,
FlatList,
Alert} from 'react-native';
import Constants from 'expo-constants';
import {SearchBar} from 'react-native-elements';
const data=[
{key:"1",title:"Android"},
{key:"2",title:"IOS"},
{key:"3",title:"React"},
{key:"4",title:"Node JS"},
{key:"5",title:"Java"},
{key:"6",title:"PHP"},
{key:"7",title:"Javascript"},
];
class FlatListWithSearch extends Component {
constructor(){
super()
this.state={
data:data,
search:""
}
}
showItem=(data)=>{
Alert.alert(data);
}

renderHeader=()=>{
const { search } = this.state;
return(
<SearchBar
placeholder="Search Here"
lightTheme
onChangeText={text=>this.searchAction(text)}
autoCorrect={false}
value={search}
/>
)
}
searchAction=(text)=>{
const newData=data.filter(item=>{
const itemData=`${item.title.toUpperCase()}`;
const textData=text.toUpperCase();
return itemData.indexOf(textData) > -1;

});
this.setState({
data:newData,
search:text
});
}

renderItem=(item)=>{
return(
<View key={item.key} style={styles.item}>
<TouchableOpacity onPress={()=>this.showItem(item.title)}>
<Text>{item.title}Text>
TouchableOpacity>
View>
)
}
render(){
return(
<SafeAreaView style={styles.container}>
<FlatList
data={this.state.data}
renderItem={({item})=>this.renderItem(item)}
keyExtractor={item=>item.key}
ListHeaderComponent={this.renderHeader}
>
FlatList>
SafeAreaView>
)
}
}
export default FlatListWithSearch;

const styles =StyleSheet.create({
container: {
flex: 1,
marginTop: Constants.statusBarHeight,
padding:10
},
item:{
padding:10,
borderWidth:1,
borderRadius:5,
borderColor:"#c1dec5",
marginBottom:10},
})


0 Comments

Leave a reply

Your email address will be private. Required fields are marked with *

Name *
Email *
Website