Hi there !

Like many others, I had some trouble adding a View to the end of the
list; after reading some posts, I stumbled over the addHeaderView() /
addFooterView() methods of ListView. Those work perfectly for adding
Views to the beginning / end of the list (which do ALSO scroll).
Unfortunately this changes the behaviour of the ListView.getAdapter()
and is poorly documented. Instead of returning the associated adapter,
the ListView returns a HeaderViewListAdapter wrapped around the
original adapter. This (of course) resulted result in a
ClassCastException when I tried to modify the underlying adapter data.
Watch out for the strange casting/unwrapping construct:
((ArrayAdapter<String>) ((HeaderViewListAdapter) listView.getAdapter
()).getWrappedAdapter()).notifyDataSetChanged(). I attach my test code
for those who want to play around with it.

For those who are looking for static header / footer Views, try
android:layout_height="0dip" and android:layout_weight="1" as Romain
Guy already pointed out several times (thanks a lot ;).

Happy coding :)

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android";
      package="debug.d3bugg0r"
      android:versionCode="1"
      android:versionName="1.0.0">
    <application android:icon="@drawable/icon" android:label="@string/
app_name">
        <activity android:name=".D3bugg0r"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category
android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>



res/layout/main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        <ListView
                android:id="@+id/listView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"/>
</LinearLayout>



src/debug/d3bugg0r/D3bugg0r.java:

package debug.d3bugg0r;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.HeaderViewListAdapter;
import android.widget.ListView;

public class D3bugg0r extends Activity implements View.OnClickListener
{
        private ListView                listView;
        private Button                  addButton;
        private Button                  removeButton;
        private List<String>    strings;

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                listView = (ListView) findViewById(R.id.listView);
                addButton = new Button(this);
                addButton.setText("ADD");
                addButton.setOnClickListener(this);
                removeButton = new Button(this);
                removeButton.setText("REMOVE");
                removeButton.setOnClickListener(this);
                listView.addFooterView(addButton);
                listView.addFooterView(removeButton);
                strings = new ArrayList<String>();
                strings.add("First");
                strings.add("Second");
                strings.add("Third");
                listView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, strings));
        }

        @SuppressWarnings("unchecked")
        @Override
        public void onClick(View view)
        {
                if(view == addButton)
                {
                        strings.add("another one");
                        ((ArrayAdapter<String>) ((HeaderViewListAdapter) 
listView.getAdapter
()).getWrappedAdapter()).notifyDataSetChanged();
                }
                else if(view == removeButton)
                {
                        if(strings.size() > 0)
                        {
                                strings.remove(strings.size() - 1);
                                ((ArrayAdapter<String>) ((HeaderViewListAdapter)
listView.getAdapter()).getWrappedAdapter()).notifyDataSetChanged();
                        }
                }
        }
}

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

Reply via email to