How to extend an ArrayAdapter?

by craiget » Fri, 10 Apr 2009 23:53:16 GMT

Sponsored Links

I'm running into difficulties overriding an ArrayAdapter to be
displayed in a ListActivity.

The ArrayAdapter is filled asynchronously.

What I'm trying to do is add a special "sentinel" object that sits at
the beginning of the list to show the progress of the computation.
Ultimately this may be a progress bar, but right now I am just using a
TextView as a placeholder.

The problem is that the sentinel seems to get inserted multiple times
into the list - not just once at the beginning. It *seems* to be
appearing once per "page" of list data (so if 8 list items fit on the
screen, my sentinel appears as the 1st, then 9th, then the 17th,
etc..), but that interpretation may not be accurate.

While maybe not how ArrayAdapters were intended to be extended, I
thought something like this should work by simply overriding getView()
to show my custom TextView for index 0:

public class CustomAdapter<E> extends ArrayAdapter<E> {

        private View sentinel;

        public CustomAdapter(Context context, int textViewResourceId, List<E>
objects) {
                super(context, textViewResourceId, objects);
                sentinel = new TextView(context);
                ((TextView)sentinel).setText("Still Loading..");

        public View getView(int position, View convertView, ViewGroup parent)
                if(position == 0)
                        return sentinel;
                return super.getView(position, convertView, parent);

        public void finish() {
                //called when async list computation finishes


The adapter is created in the usual way:

ArrayList<String> data = new ArrayList<String>();
data.add('****'); //item 0, this should get replaced
adapter = new CustomAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1, data);

My two guesses so far are: 1) When data is added asynchronously,
something goes wrong with redrawing the list view. 2) I'm not
correctly interpreting the "position" parameter of "getView()".

Any suggestions on why this doesn't work?

Thanks for reading folks.

 - C


How to extend an ArrayAdapter?

by Mark Murphy » Fri, 10 Apr 2009 23:58:11 GMT


Try addHeaderView().

You haven't indicated how you are adding stuff to the ArrayAdapter, and
your problem may lie in there.

However, I would use addHeaderView() for this circumstance, or have your
"sentinel" live outside the ListView. Remember: even though you are
using a ListActivity, you can still specify your own layout. You need
the magic android:id for the ListView (@android:id/list) in that case.

Mark Murphy (a Commons Guy)  | 

_The Busy Coder's Guide to Android Development_ Version 2.0 Available!


Sponsored Links

How to extend an ArrayAdapter?

by craiget » Sat, 11 Apr 2009 00:28:35 GMT

 Fantastic. listView.addHeaderView() works like a charm!

It seems this usage was already thought of by folks more clever than
myself. I guess it helps to know the API =)

Thanks Mark.


Other Threads

1. project

is it possible for me to have a final year project based on android
i was thinking in terms of implementing ad-hoc networks.....

2. Help getting platform

let me first say that I'm new to Adroid and SDK

Problem: when I try to download the any platform under the "Availible
Packages" section of the Android GUI, it doesn't do anything when I
click "Install Selected". It will get the list and show me what can be
downloaded, but won't actually download it.

What I've done:
Java is installed
the PATH is set in my .bashrc file
added "sdkman.force.http=true" to .android/androidtools.cfg

Any ideas would be appreciated. Thanks


3. WVGA432 and long/notlong

4. voice quality not good

5. Scenes berubah based on operator?

6. ExpandableListView crash when the list starts empty

7. MPEG2 TS + HTTP Live Streaming Support on Android