List加入headView后点击position错乱问题

1.问题描述当ListView中加入了headerView或者footerView之后,调用ListView的OnItemClick监听事件之后,获取到的position不再是我们期望的值,,比如,当我点击的是第一行,结果它显示的是第二行的position。2.问题分析从ListView的源码中可以得到我们想要的答案:1.addHeaderView(View v, Object data, boolean isSelectable):/*** Add a fixed view to appear at the top of the list. If addHeaderView is* called more than once, the views will appear in the order they were* added. Views added using this call can take focus if they want.* <p>* NOTE: Call this before calling setAdapter. This is so ListView can wrap* the supplied cursor with one that will also account for header and footer* views.** @param v The view to add.* @param data Data to associate with this view* @param isSelectable whether the item is selectable*/public void addHeaderView(View v, Object data, boolean isSelectable) {if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) {throw new IllegalStateException(“Cannot add header view to list — setAdapter has already been called.”);}FixedViewInfo info = new FixedViewInfo();info.view = v;info.data = data;info.isSelectable = isSelectable;mHeaderViewInfos.add(info);re-adding a header view, or adding one later on,// we need to notify the observerif (mAdapter != null && mDataSetObserver != null) {mDataSetObserver.onChanged();}}2.setAdapter(ListAdapter adapter): /*** Sets the data behind this ListView.** The adapter passed to this method may be wrapped by a {@link WrapperListAdapter},* depending on the ListView features currently in use. For instance, adding* headers and/or footers will cause the adapter to be wrapped.** @param adapter The ListAdapter which is responsible for maintaining the*data backing this producing a view to represent an*data set.** @see #getAdapter() */@Overridepublic void setAdapter(ListAdapter adapter) {if (mAdapter != null && mDataSetObserver != null) {mAdapter.unregisterDataSetObserver(mDataSetObserver);}resetList();mRecycler.clear();if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);} else {mAdapter = adapter;}…..}3.问题解决1.从源码中可以分析得到,addHeaderView(View v, Object data, boolean isSelectable)方法必须要在setAdapter之前调用,而addFooterView(View v, Object data, boolean isSelectable)方法不需要必须在setAdapter之前调用。2.当有headView的时候,就不能再用adapter.getItem(position),而需要通过parent获取到adapter,再进行操作,parent.getAdapter().getItem(position)这样获取到的Item,就是我们想要的结果了。

躲在墙角、掩藏那孤独而又不奢怜悯的伤…

List加入headView后点击position错乱问题

相关文章:

你感兴趣的文章:

标签云: