Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best place to addHeaderView in ListFragment

I'm having some trouble setting up my custom header in my list.

I'm creating a ListFragment with a custom adapter. I have the list working fine, but I'm trying to figure out where in the lifecycle of a Fragment to attach the header.

I know the header has to be added before you set your adapter.

I tried adding my header in onActivityCreated, but that gets called every time my Fragment comes back from the backstack, and since I also set my adapter in onActivityCreated, it fails.

I tried adding it in onCreate, but the view hierarchy isn't available at that stage of the lifecycle.

I tried adding it in onCreateView, but I couldn't cast the view returned from inflate to a ListView. So I couldn't add my header to a vanilla View.

Any thoughts?

like image 819
brockoli Avatar asked Apr 18 '11 14:04

brockoli


1 Answers

I don't know if you have solved your problem but here is a solution that worked for me:

Do not call ListFragment.setListAdapter() in your ListFragment.onCreate(). Make sure you have a field variable that can hold the header view, maybe like:

View mheaderView; 

Then in your ListFragment.onCreateView(), inflate the header View and assign it to your variable like so:

View list_root = inflater.inflate(R.layout.fragment_list, null); // Get the list header - to be added later in the lifecycle // during onActivityCreated() mheaderView = inflater.inflate(R.layout.list_header, null); return list_root; 

Finally, in your ListFragment.onActivityCreated() you can now call ListFragment.getListView().addHeaderView(). Basically something like so:

super.onActivityCreated(savedInstanceState); if (mheaderView != null)  this.getListView().addHeaderView(headerView); // Don't forget to now call setListAdapter() this.setListAdapter(listAdapter); 
like image 120
ugo Avatar answered Oct 04 '22 21:10

ugo