首页 > 代码库 > ListView addHeaderView 对 position 的影响

ListView addHeaderView 对 position 的影响

 

1. 在 public View getView(int position, View convertView, ViewGroup parent)
position 和 是否有headerView无关,列表item的序号。


2. 在 public void onItemClick(AdapterView<?> parent, View view, int position, long id) 点击事件中
position 是算上了headerView的
要对应上 列表item的序号需要 position-=mListView.getHeaderViewsCount();


3. 比较坑的是 Adapter 的 public Object getItem(int position) 方法。
如果调用了addHeaderView,则用 mListView.getAdapter() 获取的adapter不是开始设置进去的那个adapter。
而是一个HeaderViewListAdapter,对原始Adapter进行了包装。
用这个 mListView.getAdapter().getItem(position); 时,会对position-=headerCound后,再调用原始的Adapter的getItem

public Object getItem(int position) {        // Header (negative positions will throw an ArrayIndexOutOfBoundsException)        int numHeaders = getHeadersCount();        if (position < numHeaders) {            return mHeaderViewInfos.get(position).data;        }        // Adapter        final int adjPosition = position - numHeaders;        int adapterCount = 0;        if (mAdapter != null) {            adapterCount = mAdapter.getCount();            if (adjPosition < adapterCount) {                return mAdapter.getItem(adjPosition);            }        }        // Footer (off-limits positions will throw an ArrayIndexOutOfBoundsException)        return mFooterViewInfos.get(adjPosition - adapterCount).data;    }