原理是这样的:
先说明一下三个名称:
吸附条: 没有阴影,有颜色的条目
吸附条副本: 第一个显示的有颜色加上有阴影的条目下一个吸附条: 屏幕中显示的第二个有颜色的条目
当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