tags:

views:

318

answers:

3

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?

A: 

Just use a EditText above or below your list. Once a user clicks/selects it, the android virtual keyboard pops up.

h0b0
+1  A: 

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

noah
@noah: I followed your suggestion and updated my question with the code I used. Any idea what I am missing in my code?
James Testa
ArrayAdapter in the Android source implements Filterable: http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/widget/ArrayAdapter.java;h=32e55048ed18734c71c95b7f9a4e82283a7bf6c1;hb=refs/heads/froyo
noah
A: 

As yet another approach, the ListView itself can show the text that the user is entering (as opposed to using a separate TextView) by handling the onKeyUp events, scrolling the ListView to the item that has the entered text, and underlining that text in the ListView. I use AsyncTask to implement the ListView text search and that results in a convenient type ahead capability.

gregS