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

4.

mListView.setOnScrollListener(new OnScrollListener() {

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
Log.e("test", "fv:" + firstVisibleItem + ", vc=" + visibleItemCount + ", cnt=" + totalItemCount);
}
});

firstVisibleItem 是listView中第一个可见item的idx。
当没有headerView和footerView时,这个序号和Adapter里面的position对应。
当有header时,firstPosition = firstVisibleItem - header个数

最后一个可见item的position是:
lastPosition = firstVisibleItem + visibleItemCount - header个数 - 1

注意:firstPosition可能<0, lastPosition可能大于adapter.getCount()注意判断边界。

visibleItemCount 可见子View的个数,这个不是固定值,按实际显示的格式,包括可见的header和footer

totalItemCount adapter中getCount() 个数,加上header,footer的个数

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;
}
上一篇:假如想要建设一个能承受500万PV/每天的网站,服务器每秒要处理多少个请求才能应对?


下一篇:从0开始学Swift笔记整理(二)