42

I looke at the ListView API and I saw the method:

addHeaderView(View v)

What I want to do is to have a layout above the list, is this possible ?

I tried doing something like :

  EditText et=new EditText(this);
  et.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT,     LayoutParams.WRAP_CONTENT));
  et.setInputType(InputType.TYPE_CLASS_TEXT); 
  addHeaderView(et); //makes app crash

I also tried

setContentView(R.layout.tryview);

but it also make the app crash.

Help is very much appreciated!

Edit : The code for this class is:

public class GroupsActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  String your_array_contents[] = {"a","ab","c"};
  setListAdapter(new ArrayAdapter<String>(this, R.layout.groups_layout, your_array_contents));
  EditText et=new EditText(this);
  et.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  et.setInputType(InputType.TYPE_CLASS_TEXT); 

  ListView lv = getListView();
  lv.setTextFilterEnabled(true);
  lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

  lv.setAdapter(new ArrayAdapter<String>(GroupsActivity.this,
    android.R.layout.simple_list_item_multiple_choice, your_array_contents));
    lv.addHeaderView(et); //makes app crash
  lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
      // When clicked, show a toast with the TextView text
     // Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
          //Toast.LENGTH_SHORT).show();
    }
  });
}


}
Belgi
  • 14,542
  • 22
  • 58
  • 68
  • Look at my answer. Hope it will help you. Also refer the link I mentioned in my answer. – user370305 Nov 02 '11 at 09:56
  • @user370305 - look at my comment on your answer – Belgi Nov 02 '11 at 10:05
  • What is crashes log? I think you get nullPointerException. right? – user370305 Nov 02 '11 at 10:06
  • @user370305 - I tried to run it in debug mode and got resource not found on " lv.addHeaderView(header);" – Belgi Nov 02 '11 at 10:11
  • the code in the link I suggested is just for the understand purpose, you can't direct use it, because you don't know which layout I used in it, just make simple layout.xml file for header, inflate it for view and set as headerView(). – user370305 Nov 02 '11 at 10:16
  • @user370305 - but I call inflate with *my* xml file: View header = (View)getLayoutInflater().inflate(R.layout.tryview,null); – Belgi Nov 02 '11 at 10:19
  • Look at my edited answer I put a link of tutorial listview with header and footer just try that and understand how it works. – user370305 Nov 02 '11 at 10:23

3 Answers3

78

You can add as many headers as you like by calling addHeaderView() multiple times. You have to do it before setting the adapter to the list view.

And yes you can add header something like this way:

LayoutInflater inflater = getLayoutInflater();
ViewGroup header = (ViewGroup)inflater.inflate(R.layout.header, myListView, false);
myListView.addHeaderView(header, null, false);
Paresh Mayani
  • 127,700
  • 71
  • 241
  • 295
29

You simply can't use View as a Header of ListView.

Because the view which is being passed in has to be inflated.

Look at my answer at Android ListView addHeaderView() nullPointerException for predefined Views for more info.

EDIT:

Look at this tutorial Android ListView and ListActivity - Tutorial .

EDIT 2: This link is broken Android ListActivity with a header or footer

Community
  • 1
  • 1
user370305
  • 108,599
  • 23
  • 164
  • 151
  • I tried adding View header = (View)getLayoutInflater().inflate(R.layout.headerView,null); ls.addHeaderView(header); but it crashes. (I added this after the line lv.setAdapter(new ArrayAdapter(GroupsActivity.this, android.R.layout.simple_list_item_multiple_choice, your_array_contents));) – Belgi Nov 02 '11 at 10:03
  • 12
    Before Android version 4.4 you can't use addHeaderView after setAdapter method. – DcodeChef Jan 20 '14 at 05:11
  • Link Edit 2, gives Error 404, so remove it or fixing the link will be appreciated. – Ravi Vaniya Nov 16 '17 at 07:15
1

I found out that inflating the header view as:

inflater.inflate(R.layout.listheader, container, false);

being container the Fragment's ViewGroup, inflates the headerview with a LayoutParam that extends from FragmentLayout but ListView expect it to be a AbsListView.LayoutParams instead.

So, my problem was solved solved by inflating the header view passing the list as container:

ListView list = fragmentview.findViewById(R.id.listview);
View headerView = inflater.inflate(R.layout.listheader, list, false);

then

list.addHeaderView(headerView, null, false);

Kinda late answer but I hope this can help someone