Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ListView addHeaderView causes position to increase by one?

Below is a code snippet with a ListView. I added an emptyView and a headerView. Adding the headerView causes the position in the onItemClick to be increased by one.

So without the headerView the first list element would have position 0, with the headerView the position of the first list element would be 1!

This causes errors in my adapter, e.g. when calling getItem() and using some other methods, see below. Strange thing: In the getView() method of the adapter the first list element is requested with position 0 even if the headerView is added!!

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {     ListView list = (ListView) viewSwitcher.findViewById(R.id.list);     View emptyView = viewSwitcher.findViewById(R.id.empty);     list.setEmptyView(emptyView);      View sectionHeading = inflater.inflate(R.layout.heading, list, false);     TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);     sectionHeadingTextView.setText(headerText);     list.addHeaderView(sectionHeading);      list.setAdapter(listAdapter);      list.setOnItemClickListener(new OnItemClickListener() {          @Override         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {             listAdapter.getItem(position);             //Do something with it         }     }); } 

Some adapter methods:

@Override public int getViewTypeCount() {     return TYPE_COUNT; }  @Override public int getItemViewType(int position) {     return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED; }      @Override public Product getItem(int position) {     return items.get(position); } @Override public boolean areAllItemsEnabled() {     return false; }  @Override public boolean isEnabled(int position) {     return (position < items.size()); } 

Is this the normal behaviour when adding a headerView?? And how to overcome the issues in my adapter?

like image 338
d1rk Avatar asked Jun 19 '12 17:06

d1rk


2 Answers

I just came across this problem and the best way seems to use the ListView.getItemAtPosition(position) instead of ListAdapter.getItem(position) as the ListView version accounts for the headers, ie:-

Do this instead:

myListView.getItemAtPosition(position) 
like image 138
Ian Warwick Avatar answered Oct 12 '22 10:10

Ian Warwick


If you don't care about the click to the header, subtract the number of header views from the position to get the position for your adapter:

        listView.addHeaderView(inflater.inflate(                 R.layout.my_hdr_layout, null), null, false);         listView.setAdapter(m_adapter);         listView.setOnItemClickListener(new OnItemClickListener() {          @Override         public void onItemClick(AdapterView<?> parent, View view,                 int position, long id) {             position -= listView.getHeaderViewsCount();             final MyObject object = m_adapter.getItem(position);          }     }); 
like image 25
farid_z Avatar answered Oct 12 '22 10:10

farid_z