views:

2278

answers:

1

Hello,

I'm using an ArrayAdapter to add items to a custom ListView and showing the results in my Android app. The problem I'm having is that the ArrayAdapter seems to wait until all items are in it before it shows the view. That is to say, when I'm adding the items to the ArrayAdapter and I call notifyDataSetChanged, it does not update the ListView to show the added item. It waits until all items are added and GetView is called before showing the items.

What I would like it to do is to show the item immediately after adding it to the ListView. Is this possible?

I believe the relevant code is the following:

r_adapter = new ReminderAdapater(Activity_ContentSearch.this, R.layout.search_listitem, myList);
listView.setAdapter(r_adapter);
...
r_adapter.notifyDataSetChanged();
r_adapter.clear();
for(int i = 0; i < myList.size(); i++)
{
    r_adapter.add(myList.get(i));
    r_adapter.notifyDataSetChanged();
}

As you can see, even though I am calling notifyDataSetChanged after the add method, it does not actually update the view. After it has finished the above loop the view is finally updated (based on what I know, that's because GetView isn't called until after this section of the code is done).

I tried to override the add method of my custom ArrayAdapter with no luck, since I don't have access to the view in that method.

Any help would be welcome :)

Bara

+5  A: 

Android's UI is single-threaded. You are not giving control back to Android from the main application thread each time you add an entry to the adapter. Hence, Android does not get a chance to display your entries until you return control, and you're not doing that until you have populated your adapter in its entirety.

Here is an example showing the use of an AsyncTask to fill an ArrayAdapter progressively via a background thread.

CommonsWare