Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android - search listview?

Tags:

Is it possible with Android to have a search bar for a ListView so that when the search bar is touched a keyboard pops up, and when text is typed into the search bar, the items that match in the ListView are shown?

What I really need is the search bar that brings up a keyboard.

Update:

I've added the EditText field that brings up a keyboard and I can type into the EditText field. What I want is to have the first few characters of the items in the list shown in the ListView match the characters typed into the EditText window.

I've tried following the approach listed here ListView Filter but I am a little confused as to how much filtering is already done in ListView?

1) Do I need to create a separate array that stores the values that match the text typed into EditText? From this post Call adapter.notifyDataSetChanged, it appears that ListView already has a shadow array to do this, and it gets updated when adapter.notifyDataSetChanged(); is called.

2) Do I need to call adapter.notifyDataSetChanged(); to have ListView updated after I type some text in the EditText window?

3) Do I need to extend ListActivity as this post indicates? If so how do I extend my activity class if the activity class is already being extended from the main activity?

4) What I currently have is the following:

ArrayAdapter<String> adapter = null;
private EditText filterText = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.symptom);
    ListView symptomList = (ListView) findViewById(R.id.ListView_Symptom);
    symptomList.setTextFilterEnabled(true);
    symptomList.setFastScrollEnabled(true);
    filterText = (EditText) findViewById(R.id.search_box);
    filterText.addTextChangedListener(filterTextWatcher);

    adapter = new ArrayAdapter<String>(this, R.layout.menu_item, symptomsArray);
    symptomList.setAdapter(adapter);

    private TextWatcher filterTextWatcher = new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            adapter.getFilter().filter(s);
            adapter.notifyDataSetChanged();
        }

    };

Unfortunately at the moment when I type in the EditText box, I get a NullPointer Exception in

 Thread [<7> Filter] (Suspended (exception NullPointerException))   
ArrayAdapter$ArrayFilter.performFiltering(CharSequence) line: 437   
Filter$RequestHandler.handleMessage(Message) line: 234  
Filter$RequestHandler(Handler).dispatchMessage(Message) line: 99    
Looper.loop() line: 123 
HandlerThread.run() line: 60    

Any idea what I am missing?

like image 379
James Testa Avatar asked Aug 23 '10 17:08

James Testa


People also ask

How to Search item in ListView in android?

This article explains how to search for Item in a ListView. First, you will create an XML file and use an EditText and ListView. The EditText is used to search for an item and the ListView is used to show the list of items. Now you will create a Java file and write code to show an item in a ListView.

How do I create a search bar on Android?

Add the Search View to the App Bar To add a SearchView widget to the app bar, create a file named res/menu/options_menu. xml in your project and add the following code to the file. This code defines how to create the search item, such as the icon to use and the title of the item.

What is a ListView in android?

Android ListView is a view which groups several items and display them in vertical scrollable list. The list items are automatically inserted to the list using an Adapter that pulls content from a source such as an array or database.


2 Answers

You have done very small mistake :- create array adapter before setting text changed Listener to the edit text

see the corrected code

public class SearchListView extends Activity
{


/** Called when the activity is first created. */

private ListView lv1;
private String lv_arr[] =
{ "Android", "iPhone", "BlackBerry", "me", "J2ME", "Listview", "ArrayAdapter", "ListItem", "Us", "UK", "India" };
ListView lst;
EditText edt;
ArrayAdapter<String> arrad;



@Override
public void onCreate( Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    lv1=(ListView)findViewById(R.id.ListView01);
    edt = (EditText) findViewById(R.id.EditText01);

     arrad =  new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , lv_arr);
     lv1.setAdapter(arrad);

    // By using setTextFilterEnabled method in listview we can filter the listview items.

     lv1.setTextFilterEnabled(true);
     edt.addTextChangedListener(new TextWatcher()
    {


        @Override
        public void onTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
        {
            // TODO Auto-generated method stub

        }



        @Override
        public void beforeTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
        {
            // TODO Auto-generated method stub

        }



        @Override
        public void afterTextChanged( Editable arg0)
        {
            // TODO Auto-generated method stub
            SearchListView.this.arrad.getFilter().filter(arg0);

        }
    });

}

}

like image 95
Hardik Muliya Avatar answered Oct 18 '22 22:10

Hardik Muliya


If you implement Filterable in your adapter, ListView can handle the filtering.

like image 34
noah Avatar answered Oct 18 '22 23:10

noah