Android Search Filter ListView Images And Texts Tutorial
Last Updated: June 1, 2013
In this tutorial, you will learn how to implement a search functionality to your listview that filters images and texts in your Android application. A listview can be filtered by the user input and is enabled using addTextChangedListener method. The search function will filter the listview with a matching string from the user input. Searching through listview provides user an easy way to find the information they needed. The search functionality will filter the ListView with a matching string from the users input. We will create a listview with an edittext placed on top and on text input will filter the results of images and texts and on listview item click will open a new activity. So lets begin…
Create a new project in Eclipse File > New > Android Application Project. Fill in the details and name your project FilterListViewImg.
Application Name : FilterListViewImg
Project Name : FilterListViewImg
Package Name : com.androidbegin.filterlistviewimg
Open your MainActivity.java and paste the following code.
MainActivity.java
package com.androidbegin.filterlistviewimg; import java.util.ArrayList; import java.util.Locale; import android.os.Bundle; import android.app.Activity; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.ListView; public class MainActivity extends Activity { // Declare Variables ListView list; ListViewAdapter adapter; EditText editsearch; String[] rank; String[] country; String[] population; int[] flag; ArrayList<WorldPopulation> arraylist = new ArrayList<WorldPopulation>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_main); // Generate sample data rank = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; country = new String[] { "China", "India", "United States", "Indonesia", "Brazil", "Pakistan", "Nigeria", "Bangladesh", "Russia", "Japan" }; population = new String[] { "1,354,040,000", "1,210,193,422", "315,761,000", "237,641,326", "193,946,886", "182,912,000", "170,901,000", "152,518,015", "143,369,806", "127,360,000" }; flag = new int[] { R.drawable.china, R.drawable.india, R.drawable.unitedstates, R.drawable.indonesia, R.drawable.brazil, R.drawable.pakistan, R.drawable.nigeria, R.drawable.bangladesh, R.drawable.russia, R.drawable.japan }; // Locate the ListView in listview_main.xml list = (ListView) findViewById(R.id.listview); for (int i = 0; i < rank.length; i++) { WorldPopulation wp = new WorldPopulation(rank[i], country[i], population[i], flag[i]); // Binds all strings into an array arraylist.add(wp); } // Pass results to ListViewAdapter Class adapter = new ListViewAdapter(this, arraylist); // Binds the Adapter to the ListView list.setAdapter(adapter); // Locate the EditText in listview_main.xml editsearch = (EditText) findViewById(R.id.search); // Capture Text in EditText editsearch.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub String text = editsearch.getText().toString().toLowerCase(Locale.getDefault()); adapter.filter(text); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } }); } }
In this activity, we have created string arrays with sample data and pass it into the ListViewAdapter class. On listview item click will pass the selected position and string arrays to a new activity. An EditText will capture user input as a search parameter and pass it to the filter function in ListViewAdapter.
We have prepared some sample images for this tutorial. Insert your downloaded sample images into your res > drawable-hdpi.
Sample Images
[wpfilebase tag=file id=35 tpl=download-button /]
Next, create an array class. Go to File > New > Class and name it WorldPopulation.java. Select your package named com.androidbegin.filterlistviewimg and click Finish.
Open your WorldPopulation.java and paste the following code.
WorldPopulation.java
package com.androidbegin.filterlistviewimg; public class WorldPopulation { private String rank; private String country; private String population; private int flag; public WorldPopulation(String rank, String country, String population, int flag) { this.rank = rank; this.country = country; this.population = population; this.flag = flag; } public String getRank() { return this.rank; } public String getCountry() { return this.country; } public String getPopulation() { return this.population; } public int getFlag() { return this.flag; } }
Next, create an XML graphical layout for your MainActivity. Go to res > layout > Right Click on layout > New > Android XML File
Name your new XML file listview_main.xml and paste the following code.
listview_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/search" android:layout_width="fill_parent" android:layout_height="wrap_content" > <requestFocus /> </EditText> <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/search" /> </RelativeLayout>
Output:
Next, create a ListViewAdapter class. Go to File > New > Class and name it ListViewAdapter.java. Select your package named com.androidbegin.filterlistviewimg and click Finish.
Open your ListViewAdapter.java and paste the following code.
ListViewAdapter.java
package com.androidbegin.filterlistviewimg; import java.util.ArrayList; import java.util.List; import java.util.Locale; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import android.view.View.OnClickListener; public class ListViewAdapter extends BaseAdapter { // Declare Variables Context mContext; LayoutInflater inflater; private List<WorldPopulation> worldpopulationlist = null; private ArrayList<WorldPopulation> arraylist; public ListViewAdapter(Context context, List<WorldPopulation> worldpopulationlist) { mContext = context; this.worldpopulationlist = worldpopulationlist; inflater = LayoutInflater.from(mContext); this.arraylist = new ArrayList<WorldPopulation>(); this.arraylist.addAll(worldpopulationlist); } public class ViewHolder { TextView rank; TextView country; TextView population; ImageView flag; } @Override public int getCount() { return worldpopulationlist.size(); } @Override public WorldPopulation getItem(int position) { return worldpopulationlist.get(position); } @Override public long getItemId(int position) { return position; } public View getView(final int position, View view, ViewGroup parent) { final ViewHolder holder; if (view == null) { holder = new ViewHolder(); view = inflater.inflate(R.layout.listview_item, null); // Locate the TextViews in listview_item.xml holder.rank = (TextView) view.findViewById(R.id.rank); holder.country = (TextView) view.findViewById(R.id.country); holder.population = (TextView) view.findViewById(R.id.population); // Locate the ImageView in listview_item.xml holder.flag = (ImageView) view.findViewById(R.id.flag); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } // Set the results into TextViews holder.rank.setText(worldpopulationlist.get(position).getRank()); holder.country.setText(worldpopulationlist.get(position).getCountry()); holder.population.setText(worldpopulationlist.get(position) .getPopulation()); // Set the results into ImageView holder.flag.setImageResource(worldpopulationlist.get(position) .getFlag()); // Listen for ListView Item Click view.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // Send single item click data to SingleItemView Class Intent intent = new Intent(mContext, SingleItemView.class); // Pass all data rank intent.putExtra("rank", (worldpopulationlist.get(position).getRank())); // Pass all data country intent.putExtra("country", (worldpopulationlist.get(position).getCountry())); // Pass all data population intent.putExtra("population", (worldpopulationlist.get(position).getPopulation())); // Pass all data flag intent.putExtra("flag", (worldpopulationlist.get(position).getFlag())); // Start SingleItemView Class mContext.startActivity(intent); } }); return view; } // Filter Class public void filter(String charText) { charText = charText.toLowerCase(Locale.getDefault()); worldpopulationlist.clear(); if (charText.length() == 0) { worldpopulationlist.addAll(arraylist); } else { for (WorldPopulation wp : arraylist) { if (wp.getCountry().toLowerCase(Locale.getDefault()) .contains(charText)) { worldpopulationlist.add(wp); } } } notifyDataSetChanged(); } }
In this custom listview adapter class, string arrays are passed into the ListViewAdapter and set into the TextViews and ImageViews followed by the positions. On listview item click will pass the string arrays and position to a new activity. The filter class captures the user input text from the MainActivity and refreshes the listview to show a matched result.
Next, create an XML graphical layout for your listview item. Go to res > layout > Right Click on layout > New > Android XML File
Name your new XML file listview_item.xml and paste the following code.
listview_item.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/ranklabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ranklabel" /> <TextView android:id="@+id/rank" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ranklabel" /> <TextView android:id="@+id/countrylabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ranklabel" android:text="@string/countrylabel" /> <TextView android:id="@+id/country" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/rank" android:layout_toRightOf="@+id/countrylabel" /> <TextView android:id="@+id/populationlabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/countrylabel" android:text="@string/populationlabel" /> <TextView android:id="@+id/population" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/country" android:layout_toRightOf="@+id/populationlabel" /> <ImageView android:id="@+id/flag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:background="#000000" android:padding="1dp" /> </RelativeLayout>
Next, create an activity to display results. Go to File > New > Class and name it SingleItemView.java. Select your package named com.androidbegin.filterlistviewimg and click Finish.
Open your SingleItemView.java and paste the following code.
SingleItemView.java
package com.androidbegin.filterlistviewimg; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.ImageView; import android.widget.TextView; public class SingleItemView extends Activity { // Declare Variables TextView txtrank; TextView txtcountry; TextView txtpopulation; ImageView imgflag; String rank; String country; String population; int flag; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.singleitemview); // Get the intent from ListViewAdapter Intent i = getIntent(); // Get the results of rank rank = i.getStringExtra("rank"); // Get the results of country country = i.getStringExtra("country"); // Get the results of population population = i.getStringExtra("population"); // Get the results of flag flag = i.getIntExtra("flag", flag); // Locate the TextViews in singleitemview.xml txtrank = (TextView) findViewById(R.id.rank); txtcountry = (TextView) findViewById(R.id.country); txtpopulation = (TextView) findViewById(R.id.population); // Locate the ImageView in singleitemview.xml imgflag = (ImageView) findViewById(R.id.flag); // Load the results into the TextViews txtrank.setText(rank); txtcountry.setText(country); txtpopulation.setText(population); // Load the image into the ImageView imgflag.setImageResource(flag); } }
In this activity, strings are retrieved from the ListViewAdapter by using Intent and sets into the TextViews and ImageViews.
Next, create an XML graphical layout for your SingleItemView. Go to res > layout > Right Click on layout > New > Android XML File
Name your new XML file singleitemview.xml and paste the following code.
singleitemview.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/ranklabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ranklabel" /> <TextView android:id="@+id/rank" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ranklabel" /> <TextView android:id="@+id/countrylabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/ranklabel" android:text="@string/countrylabel" /> <TextView android:id="@+id/country" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/rank" android:layout_toRightOf="@+id/countrylabel" /> <TextView android:id="@+id/populationlabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/countrylabel" android:text="@string/populationlabel" /> <TextView android:id="@+id/population" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/country" android:layout_toRightOf="@+id/populationlabel" /> <ImageView android:id="@+id/flag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:background="#000000" android:padding="1dp" /> </RelativeLayout>
Next, change the application name and texts. Open your strings.xml in your res > values folder and paste the following code.
strings.xml
<resources> <string name="app_name">Filter ListView Images</string> <string name="hello_world">Hello world!</string> <string name="menu_settings">Settings</string> <string name="title_activity_main">Filter ListView Images</string> <string name="ranklabel">"Rank : "</string> <string name="countrylabel">"Country : "</string> <string name="populationlabel">"Population : "</string> </resources>
In your AndroidManifest.xml, declare an activity we have created above. Open your AndroidManifest.xml and paste the following code.
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidbegin.filterlistviewimg" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SingleItemView" > </activity> </application> </manifest>
Output:
Source Code
[purchase_link id=”7950″ text=”Purchase to Download Source Code” style=”button” color=”green”]
good work but i have a problem how can i make the project clickable?
Muhammet
Android Search Filter ListView Images And Texts Tutorial
How can i open original activities instead of singleitemview.java? Please help!
nivedita tomar
Android Search Filter ListView Images And Texts Tutorial
Simple solution but works perfectly
James Kayihura
Android Search Filter ListView Images And Texts Tutorial
G8t tutorial .....Thanks I did
Dixit Panchal
Android Search Filter ListView Images And Texts Tutorial