Is there an XML tag that is equivalent to `ListView.addHeaderView'?

android, android-layout, java

Solution

I wrote a simple `ListView` like your requirement.

Declare custom attribute in `attrs.xml` in `value` folder:

<resources>
    <declare-styleable name="HeaderListViewFromXML"> 
        <attr name="headerView" format="reference"/>
    </declare-styleable>
</resources>

Create `HeaderListViewFromXML` class extended `ListView`

public class HeaderListViewFromXML extends ListView {
    private int headerId;

    public HeaderListViewFromXML(Context context) {
        this(context, null);
    }

    public HeaderListViewFromXML(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public HeaderListViewFromXML(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.HeaderListViewFromXML, defStyle, defStyle);

        try {
            headerId = a.getResourceId(R.styleable.HeaderListViewFromXML_headerView, View.NO_ID);
            if (headerId != View.NO_ID) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View header = inflater.inflate(headerId, null);
                addHeaderView(header);
            }
        } finally {
            a.recycle();
        }
    }
}

Declare custom `HeaderListViewFromXML` in `layout.xml`

<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <com.example.rewidget.HeaderListViewFromXML
            android:id="@+id/listWithHeader"
            android:layout_width="fill_parent"
            android:layout_height="150dp"
            android:layout_marginTop="60dp"
            android:background="#00FF00"
            // custom attribute. Point to layout in header1.xml
            app:headerView="@layout/header1" />
</RelativeLayout>

In Activity, use like normal `ListView`

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView list = (ListView) findViewById(R.id.listWithHeader);

        String[] values = new String[] { "Android", "iPhone", "WindowsMobile", "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, values);

        list.setAdapter(adapter);
    }
}

Problem

Is there an XML tag which I can use in a layout file that is equivalent to `ListView.addHeaderView()`?

Original source