I've just added a header to my ListView and I have to change a bunch of code because the header essentially becomes position 0 (Meaning the Cursor indices of my CursorAdapter do not line up with the indicies of the list. They are off by 1 now). Why? This seems a bit silly to me.
The only reason I can come up with is that a developer may want to access the header. Fine. Provide something like getListView().getHeader().
I believe a
ListView
is nothing more than a list ofView
elements. If you add a header (or a footer for that matter, it shouldn't make any difference) to yourListView
, that element is basically no different from any of the other elements that gets added automatically through theListAdapter
. The only minor difference being that the header (and footer) element will be fixed and stay unaffected by what theListAdapter
does with the list - they are still nothing but ordinary elements though.For some reason the
position
(from theonItemClick
) is tied up with the number of items in theListView
(not the adapter), including headers and footers. When you set anOnItemClickListener
you should retrieve the clicked item by callinglistView.getItemAtPosition(position)
instead ofadapter.getItem(position)
.In fact, you should always use the
getItemAtPosition
, because that way not matter if yourListView
has headers and footers, and if you add new headers you won't need to change your code.And if you don't want your header to be selectable, you should add it in this way:
listView.addHeaderView(headerView, null, false)
.