Android 开源之StickyHeaderListView 标题渐变、吸附悬停、筛选分类、动态头部
原文鏈接:http://www.jianshu.com/p/3bf26722c489
StickyHeaderListView是基于實(shí)際需求做出的靈活可定制的UI功能,具體實(shí)現(xiàn)功能如下:
一、支持無限循環(huán)的廣告位。
二、高度可動(dòng)態(tài)配置的Header2和Header3(使用GridView實(shí)現(xiàn))。
三、主要功能:分類、排序和篩選布局滑動(dòng)到頂部后吸附、懸停。
四、自定義FilterView篩選控件,支持動(dòng)畫顯示與動(dòng)畫隱藏。
五、支持標(biāo)題欄背景顏色漸變、字體顏色漸變。
六、數(shù)據(jù)不足一屏動(dòng)態(tài)添加空數(shù)據(jù)占位。
七、數(shù)據(jù)為空時(shí),ListView加載暫無數(shù)據(jù)視圖。
八、思路清晰、界面優(yōu)美,添加ripple點(diǎn)擊效果。
九、支持下拉刷新和上拉加載更多功能。
動(dòng)態(tài)效果圖:
實(shí)現(xiàn)思路
StickyHeaderListView 主要是通過 ListView 添加頭部實(shí)現(xiàn),將復(fù)雜的頭部分解為若干部分,如下圖:Header 1(廣告位)、Header 2(頻道位)、Header 3(運(yùn)營位)、Header 4(分割線) 和 Header 5(篩選頭部),這樣各個(gè)Header部分的UI和邏輯可以單獨(dú)拿出去處理,具體可以參考我的 開源代碼。
Header 1: 它的高度影響標(biāo)題欄的顏色漸變。
Header 2: 使用GridView實(shí)現(xiàn),自定義FixedGridView,高度不受ListView的影響,一行顯示幾個(gè)自己可以根據(jù)需求設(shè)置。
Header 3: 和Header 2一樣的實(shí)現(xiàn)方式,要注意的地方就是分割線的設(shè)置,我實(shí)現(xiàn)的思路是設(shè)置GridView的背景顏色的分割線的顏色,再設(shè)置如下的四個(gè)屬性:paddingTop、paddingBottom、horizontalSpacing、verticalSpacing為1px,這樣分割線就均等了。
android:background="@color/font_black_5" android:paddingTop="1px" android:paddingBottom="1px" android:horizontalSpacing="1px" android:verticalSpacing="1px"Header 4: 這個(gè)頭部布局是需求上的,UI加上整體更加好看,為什么我要單獨(dú)拿出來,主要考慮到以下的原因:如果讓Header 5達(dá)到吸附懸停的效果,需要知道Header 5到頂部的距離,如果把分割線加到Header 5上,那在移動(dòng)的時(shí)候還需要減去這個(gè)高度;而如果加到Header 3上,Header 3是服務(wù)器動(dòng)態(tài)配置的,如果沒有Header 3的頭部怎么辦,那就加到Header 2上等,這樣邏輯就比較麻煩,干脆我直接單獨(dú)拿出來,作為一個(gè)頭部布局動(dòng)態(tài)添加。
Header 5: 這個(gè)篩選頭部是個(gè)假的布局,主要處理未吸附懸停時(shí)的點(diǎn)擊事件,點(diǎn)擊之后滑動(dòng)到頂部這時(shí)頂部的隱藏的篩選布局顯示出來達(dá)到吸附懸停的效果。同時(shí)我將這個(gè)篩選布局定義一個(gè) FilterView,將分類、排序和篩選的UI處理和邏輯封裝起來,方便其它頁面的二次使用。
還有兩點(diǎn)需要特別注意:
一、如果數(shù)據(jù)不滿一屏,比如就一條數(shù)據(jù),那點(diǎn)擊篩選它是沒辦法滑動(dòng)到頂部的,因?yàn)樗母叨炔粔?#xff0c;我的解決方法是添加若干個(gè)空數(shù)據(jù),空數(shù)據(jù)的size是根據(jù)實(shí)際一屏要顯示的個(gè)數(shù)減去現(xiàn)在的個(gè)數(shù),這樣可以達(dá)到整體可以滑動(dòng)的高度,參考 TravelingAdapter 文件。
二、如果數(shù)據(jù)為空時(shí)并且我還需要無數(shù)據(jù)的占位圖,如果在 ListView 底部加上無數(shù)據(jù)的布局這樣的效果是不好的,所以我還在這個(gè)Adapter上做文章,讓它加載一個(gè)無數(shù)據(jù)的視圖布局,同樣參考 TravelingAdapter 文件,每一個(gè)Item的高度: height = 屏幕的高度 - 標(biāo)題欄高度 - 篩選View高度,這樣設(shè)置一個(gè)這樣的高度的Adapter,再 notifyDataSetChanged() 一下,整體的視圖不會(huì)變化,無數(shù)據(jù)的占位圖也自然而然的顯示了。
最后
具體實(shí)現(xiàn)代碼移步 GitHub,下載 APK 體驗(yàn),感謝你的關(guān)注,歡迎star,希望對(duì)你有幫助,如遇到問題請(qǐng)聯(lián)系我,最后再貼幾張截圖方便你查看。
滑動(dòng)到一半時(shí)標(biāo)題欄漸變
滑動(dòng)到頂部,FilterView 吸附懸停
FilterView 動(dòng)畫顯示與隱藏
數(shù)據(jù)為空時(shí)的占位圖
總結(jié)
以上是生活随笔為你收集整理的Android 开源之StickyHeaderListView 标题渐变、吸附悬停、筛选分类、动态头部的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android键盘面板冲突 布局闪动处理
- 下一篇: 使用CoordinatorLayout打