PinnedSectionListView原理完全透析

原理是这样的:

先说明一下三个名称:

    吸附条:             没有阴影,有颜色的条目

    吸附条副本:     第一个显示的有颜色加上有阴影的条目

    下一个吸附条: 屏幕中显示的第二个有颜色的条目


Adapter的类型有两种,一种是有颜色的(吸附条类型),一种是白色的。然后把数据和listview绑定到Adapter上。listview开始滚动:

    当listview一旦开始滚动,就绘制一个吸附条副本,放在屏幕顶部。

    当下一个吸附条靠近第一个吸附条,把吸附条副本销毁。

    当下一个吸附条把第一个吸附条顶到屏幕最上边看不见的时候,画一个吸附条副本放在屏幕顶部。

效果图:



这就是核心代码:

    /**
     * 滚动监听
     */
    private final OnScrollListener mOnScrollListener = new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if (mDelegateOnScrollListener != null) { // delegate
                mDelegateOnScrollListener.onScrollStateChanged(view, scrollState);
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            Log.e("onScroll", "firstVisbleItem = " + firstVisibleItem + "\nvisibleItemCount = " + visibleItemCount +
                    "\ntotalItemCount = " + totalItemCount);//0 , 12 , 446
            if (mDelegateOnScrollListener != null) { // delegate
                mDelegateOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
            }

            // get expected adapter or fail fast  得到Adapter
            ListAdapter adapter = getAdapter();
            if (adapter == null || visibleItemCount == 0) return; // nothing to do
            //判断ListView中的第一个可见元素是否为吸附条类型
            final boolean isFirstVisibleItemSection = isItemViewTypePinned(adapter, adapter.getItemViewType(firstVisibleItem));

            if (isFirstVisibleItemSection) {
                View sectionView = getChildAt(0);
                //如果第一个元素是吸附条,且刚好在最顶端,这时是不需要绘制吸附条副本
                if (sectionView.getTop() == getPaddingTop()) {
                    destroyPinnedShadow();
                } else {//如果第一个元素没在最顶端,则根据当前吸附条的position创建一个吸附条副本     0 , 0 , 12
//                    Log.e("如果吸附条没在最顶端", "firstVisibleItem = " + firstVisibleItem + " firstVisibleItem = " + firstVisibleItem + " visibleItemCount = " + visibleItemCount);
                    ensureShadowForPosition(firstVisibleItem, firstVisibleItem, visibleItemCount);
                }
            } else { //如果第一个可见元素不是吸附条
                int sectionPosition = findCurrentSectionPosition(firstVisibleItem);
                if (sectionPosition > -1) {//如果吸附条位置 > -1
                    ensureShadowForPosition(sectionPosition, firstVisibleItem, visibleItemCount);
                } else {
                    destroyPinnedShadow();
                }
            }
        }
    };


看一看这代码注释的很清楚,我已经帮你们把代码所涉及到的知识点都做了注释。不用单行看不懂,你的逻辑会很清楚,前提是你要记住我上面写的原理

下载免积分,地址:http://download.youkuaiyun.com/detail/u012123938/9492293


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值