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. Booting Android on Samsung Star

I reacently bought Samsung Star.I am planning to boot Android on
Samsung Star.I wanted to know is it possible to boot Android on
Samsung Star


2. reg: SPI channels on HTC Dream (G1)

Hi all,

I want to use one of the SPI Channles on HTC dream for my development
use. Can any one let me know how can I use SPI channels that are
available on HTC Dream (G1).

Thanks & Regards,


3. Upload multiple versions for single android application for different SDK levels 1.5, 1.6, 2.0

4. need help : insert chat address with new contact

5. Bind a list of items to a view that doesn't act like a list

6. problem of compiling Opencore to enable BUILD_STREAMING_MANAGER_NODE=y

7. Can't access to a HTTPS