Close
Glad You're Ready. Let's Get Started!

Let us know how we can contact you.

Thank you!

We'll respond shortly.

LABS
Android Tidbits 6/22/2011: Hiding Header Views

Android ListView#addHeaderView and ListView#addFooterView methods are strange: you have to add the header and footer Views before you set the ListView‘s adapter so the ListView can take the headers and footers into consideration — you get an exception otherwise. Here we add a ProgressBar (spinner) as the headerView:

// spinner is a ProgressBar
listView.addHeaderView(spinner);

We’d like to be able to show and hide that spinner at will, but removing it outright is dangerous because we’d never be able to add it again without destroying the ListView — remember, we can’t addHeaderView after we’ve it’s adapter:

listView.removeHeaderView(spinner); //dangerous!

So let’s hide it! Turns out that’s hard, too. Just hiding the spinner view itself results in an empty, but still visible, header area.


Now try to hide the spinner:

spinner.setVisibility(View.GONE);

Result: header area still visible with an ugly space:



The solution is to put the progress bar in a LinearLayout that wraps it’s content, and hiding the content. That way the wrapping LinearLayout will collapse when its content is hidden, resulting in a headerView that is technically still present, but 0dip high:

  <LinearLayout
      xmlns:a="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content">
    <!-- simplified -->
      <ProgressBar
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
  </LinearLayout>

Then, set the layout as the header:

spinnerLayout = getLayoutInflater().inflate(R.layout.header_view_spinner, null);
listView.addHeaderView(spinnerLayout);

And when we need to hide it, hide the layout’s content, not the layout:

    spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE);

Now the header disappears from view. No more ugly space at the top!

Comments
  1. omar says:

    This worked perfectly! thanks!!!

  2. michael says:

    I am still have the ugly space

    mListView.getRefreshableView().addHeaderView(mHeaderView);
    mListView.setAdapter(mAdapter);

    private boolean isHeaderViewAdded = false;

    private void resetAdv() {
    if (mSeletedWindow.isShowAdv()) {
    if (!isHeaderViewAdded) {
    mHeaderView.findViewById(R.id.mBaseHeaderLayout).setVisibility(View.VISIBLE);
    // mListView.getRefreshableView().addHeaderView(mHeaderView, null, false);
    isHeaderViewAdded = true;
    }
    } else {
    if (isHeaderViewAdded) {
    mHeaderView.findViewById(R.id.mBaseHeaderLayout).setVisibility(View.GONE);
    // mListView.getRefreshableView().removeHeaderView(mHeaderView);
    isHeaderViewAdded = false;
    }
    }
    }

Post a Comment

Your Information (Name required. Email address will not be displayed with comment.)

* Copy This Password *

* Type Or Paste Password Here *