功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部
Tan0854
8年前
<p>StickyHeaderListView 是基于实际需求做出的灵活可定制的UI功能,具体实现功能如下:<br> 一、支持无限循环的广告位。<br> 二、高度可动态配置的Header2和Header3(使用GridView实现)。<br> 三、主要功能:分类、排序和筛选布局滑动到顶部后吸附、悬停。<br> 四、自定义FilterView筛选控件,支持动画显示与动画隐藏。<br> 五、支持标题栏背景颜色渐变、字体颜色渐变。<br> 六、数据不足一屏动态添加空数据占位。<br> 七、数据为空时,ListView加载暂无数据视图。<br> 八、思路清晰、界面优美,添加ripple点击效果。<br> 九、支持下拉刷新和上拉加载更多功能。</p> <h2>动态效果图:</h2> <p><img alt="功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部" src="https://simg.open-open.com/show/c744354f494e41fe95b13436fbc41551.gif"></p> <p>stickyheader.gif</p> <p><img alt="功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部" src="https://simg.open-open.com/show/d9c7361ba442ba4378a79bedfaee1a0b.gif"></p> <p>stickyheader2.gif</p> <h3><a href="/misc/goto?guid=4959671744262426530">APK下载地址</a></h3> <h2>实现思路</h2> <p>StickyHeaderListView 主要是通过 ListView 添加头部实现,将复杂的头部分解为若干部分,如下图:Header 1(广告位)、Header 2(频道位)、Header 3(运营位)、Header 4(分割线) 和 Header 5(筛选头部),这样各个Header部分的UI和逻辑可以单独拿出去处理,具体可以参考我的 <a href="/misc/goto?guid=4959671744352687254">开源代码</a>。</p> <p><img alt="功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部" src="https://simg.open-open.com/show/6684dcbe6333f0f8c58accc770489850.png"></p> <p>StickyHeaderListView_sumary.png</p> <p>Header 1: 它的高度影响标题栏的颜色渐变。</p> <p>Header 2: 使用GridView实现,自定义<a href="/misc/goto?guid=4959671744437544739">FixedGridView</a>,高度不受ListView的影响,一行显示几个自己可以根据需求设置。</p> <p>Header 3: 和Header 2一样的实现方式,要注意的地方就是分割线的设置,我实现的思路是设置GridView的背景颜色的分割线的颜色,再设置如下的四个属性:paddingTop、paddingBottom、horizontalSpacing、verticalSpacing为1px,这样分割线就均等了。</p> <pre> <code>android:background="@color/font_black_5" android:paddingTop="1px" android:paddingBottom="1px" android:horizontalSpacing="1px" android:verticalSpacing="1px"</code></pre> <p>Header 4: 这个头部布局是需求上的,UI加上整体更加好看,为什么我要单独拿出来,主要考虑到以下的原因:如果让Header 5达到吸附悬停的效果,需要知道Header 5到顶部的距离,如果把分割线加到Header 5上,那在移动的时候还需要减去这个高度;而如果加到Header 3上,Header 3是服务器动态配置的,如果没有Header 3的头部怎么办,那就加到Header 2上等,这样逻辑就比较麻烦,干脆我直接单独拿出来,作为一个头部布局动态添加。</p> <p>Header 5: 这个筛选头部是个假的布局,主要处理未吸附悬停时的点击事件,点击之后滑动到顶部这时顶部的隐藏的筛选布局显示出来达到吸附悬停的效果。同时我将这个筛选布局定义一个 <a href="/misc/goto?guid=4959671744517385857">FilterView</a>,将分类、排序和筛选的UI处理和逻辑封装起来,方便其它页面的二次使用。</p> <p>还有两点需要特别注意:</p> <p>一、如果数据不满一屏,比如就一条数据,那点击筛选它是没办法滑动到顶部的,因为她的高度不够,我的解决方法是添加若干个空数据,空数据的size是根据实际一屏要显示的个数减去现在的个数,这样可以达到整体可以滑动的高度,参考 <a href="/misc/goto?guid=4959671744607219194">TravelingAdapter</a> 文件。</p> <p>二、如果数据为空时并且我还需要无数据的占位图,如果在 ListView 底部加上无数据的布局这样的效果是不好的,所以我还在这个Adapter上做文章,让它加载一个无数据的视图布局,同样参考 <a href="/misc/goto?guid=4959671744607219194">TravelingAdapter</a> 文件,每一个Item的高度: height = 屏幕的高度 - 标题栏高度 - 筛选View高度,这样设置一个这样的高度的Adapter,再 notifyDataSetChanged() 一下,整体的视图不会变化,无数据的占位图也自然而然的显示了。</p> <h2>最后</h2> <p>具体实现代码移步 <a href="/misc/goto?guid=4959671744352687254">GitHub</a>,下载 <a href="/misc/goto?guid=4959671744262426530">APK</a> 体验,感谢你的关注,欢迎star,希望对你有帮助,如遇到问题请联系我,最后再贴几张截图方便你查看。</p> <p>滑动到一半时标题栏渐变</p> <p><img alt="功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部" src="https://simg.open-open.com/show/d0b9a710e5e89695afbde082ffe964c8.png"></p> <p>StickyHeaderListView2.png</p> <p>滑动到顶部,FilterView 吸附悬停</p> <p><img alt="功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部" src="https://simg.open-open.com/show/665756ffa57ca281edd05107b7dcb80b.png"></p> <p>StickyHeaderListView3.png</p> <p>FilterView 动画显示与隐藏</p> <p><img alt="功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部" src="https://simg.open-open.com/show/5f376e07dde5986c5950c29b28dfec43.png"></p> <p>StickyHeaderListView4.png</p> <p>数据为空时的占位图</p> <p><img alt="功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部" src="https://simg.open-open.com/show/587b39236fb88f8f5b0370f57f3b0207.png"></p> <p><br> </p>