Hi!

I have a ListView with a custom Adapter that extends ArrayAdapter. It's a ArrayAdapter of Type Artist. (There are about 1200 artists in my list)

Artist is a very small class that has a name and an id. The Artist Class has toString() overridden to return just the name.

I have an EditText. The EditText has an TextChangeListener where i call .getFilter().filter(chars, callback) on my adapter.

In the Filter.Filterlistener().onComplete() callback i print the count and it looks really good. As i type the count decreases. So it seams everything works as advertised, but the List stays the same. I tried to call artistAdapter.notifyDataSetChanged() to force the list to redraw, but nothing happens. [see 2.)]

I am tinkering around for days now! I am desperate.. Hopefully someone can have a look on my code and tell me what i am doing wrong! How can i force the list to be redrawn?

Thanks!

(I have posted this question also on stackoverflow: http://stackoverflow.com/questions/2505800/filtered-listview-not-updated)

Here is what i have done:

1.) Defined a ListView and an EditText like this:

   <EditText xmlns:android="http://schemas.android.com/apk/res/android";
       android:id="@+id/list_search_text"
       android:layout_width="fill_parent"
       android:layout_height="35dip"
       android:layout_below="@id/header">
</EditText> <ListView xmlns:android="http://schemas.android.com/apk/res/android";
       android:id="@+id/list_search"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">
   </ListView>

2.) Setup my ListView in the Activities onCreate():

   private ListView listView = null;
   private ArtistAdapter artistAdapter = null;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.search_artists);

artistAdapter = new ArtistAdapter(this, R.layout.row, list); // 'list' is an ArrayList<Artist>

       listView = (ListView) findViewById(R.id.list_search);
       listView.setAdapter(artistAdapter);
       listView.setFastScrollEnabled(true);
       listView.setTextFilterEnabled(true);

       listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> av, View v, int position, long id) {
               // do something
           }
       });

       EditText txtSearch = (EditText) findViewById(R.id.list_search_text);
       txtSearch.addTextChangedListener(new TextWatcher() {
           public void afterTextChanged(Editable arg0) { }

public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }

public void onTextChanged(CharSequence chars, int start, int before, int count) { artistAdapter.getFilter().filter(chars, new Filter.FilterListener() {
                   public void onFilterComplete(int count) {
Log.d(Config.LOG_TAG, "filter complete! count: " + count);
                       artistAdapter.notifyDataSetChanged();
                   }
               });
           }
       });
   }

3.) This is my ArtistAdapter in short. I added an remove() and add() method:

public class ArtistAdapter extends ArrayAdapter<Artist> implements SectionIndexer {
       private List<Artist> items;

/* other stuff like overridden getView, getPositionForSection, getSectionForPosition and so on */

       @Override
       public void remove(Artist object) {
           super.remove(object);
           items.remove(object);
       }

       @Override
       public void add(Artist object) {
           super.add(object);
           items.add(object);
       }
}
4.) My artist has also the toString() overridden:

   public class Artist implements Comparable<Artist> {
       public String   uid;
       public String   name;

       public Artist(String id, String name) {
           this.uid = id;
           this.name = name;
       }

       public int compareTo(Artist another) {
           return this.name.compareToIgnoreCase(another.name);
       }

       @Override
       public String toString() {
           return this.name;
       }
   }

--
DI(FH) Anton Pirker

------------------------------
cross platform mobile software
burggasse 123/53
a-1070 wien
tel: +43 699 1234 0 456
skype: antonpirker

http://anton-pirker.at



--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

To unsubscribe from this group, send email to 
android-developers+unsubscribegooglegroups.com or reply to this email with the words 
"REMOVE ME" as the subject.

Reply via email to