zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    微擎开发笔记
    Array对象的方法实现(1)----Array.prototype.push和Array.prototype.concat(实现常规参数的功能)
    ThinkCMF 5 基础门户CMS框架的模板widget标签实现
    [转]mysql为什么默认有那么多root用户,还有用户名为空的用户?
    PHP 5.4特性 trait
    道破人性
    c#使用easyhook库进行API钩取
    黑马eesy_15 Vue:04.综合案例(前端Vue实现)
    黑马eesy_15 Vue:04.Vue案例(ssm环境搭建)
    黑马eesy_15 Vue:03.生命周期与ajax异步请求
  • 原文地址:https://www.cnblogs.com/zijianlu/p/3915299.html
Copyright © 2011-2022 走看看