• 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;
        }
  • 相关阅读:
    SRF 认证
    Python getattr
    jQueryattr()与prop()之间的区别
    鼠标事件(拖拽)
    Python中操作MySQL的模块---pymsql
    C++ 存储类
    C++ 修饰符类型
    C++ 变量作用域
    C++ 变量类型
    C++ 数据类型
  • 原文地址:https://www.cnblogs.com/zijianlu/p/3915299.html
Copyright © 2020-2023  润新知