RecyclerView提供了良好的設(shè)計哩盲,將各部分功能的實現(xiàn)都拆解開艰管,方便自定義滓侍,雖然加大了使用難度,但是卻大大的增加了可擴展性牲芋,稍微會使用之后撩笆,擴展起來非常的舒心。
功能:適用于以下幾種布局的分割線和粘性頭部
- LinearLayoutManager
- GridLayoutManager (水平方向粘性頭部暫未實現(xiàn))
- StaggeredGridLayoutManager (粘性頭部暫未實現(xiàn))
對于分割線缸浦,與大多數(shù)的實現(xiàn)不同夕冲,在GridLayoutManager和StaggeredGridLayoutManager布局時是平分Item的,分割線大的時候就能發(fā)現(xiàn)
先上效果圖
注意:其中這三種布局的分割線不管是水平還是垂直方向都是支持的裂逐,但是帶有header的只支持LinearLayoutManager的水平和垂直以及GridLayoutManager垂直方向
還可以下載Demo在手機上預(yù)覽一下歹鱼。
使用
1、在根目錄的build.gradle中加入如下配置
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2卜高、在要用的module中增加如下引用
dependencies {
...
implementation 'com.github.arvinljw:ItemDecorationHelper:v1.0.5'
implementation 'com.android.support:recyclerview-v7:'.concat(supportVersion)
}
其中supportVersion換成自己app中的版本即可
3弥姻、為RecyclerView添加ItemDecoration,通過ItemDecorationFactory生成包括分割線的ItemDecoration和粘性頭部的ItemDecoration掺涛,后者包含了分割線
- ItemDecorationFactory.DividerBuilder 分割線
itemDecoration = new ItemDecorationFactory.DividerBuilder()
.dividerHeight(2)
.dividerColor(Color.parseColor("#D8D8D8"))
.showLastDivider(false)//默認是true
.build(recyclerView);
recyclerView.addItemDecoration(itemDecoration);
- ItemDecorationFactory.StickyDividerBuilder 粘性頭部
itemDecoration = new ItemDecorationFactory.StickyDividerBuilder()
.dividerHeight(2)
.dividerColor(Color.parseColor("#D8D8D8"))
.callback(new StickyDividerCallback() {
@Override
public GroupData getGroupData(int position) {
//生成GroupData
return data;
}
@Override
public View getStickyHeaderView(int position) {
//...生成headerView
return headerView;
}
}).build(recyclerView);
recyclerView.addItemDecoration(itemDecoration);
其中如果是粘性頭部庭敦,需要自己生成GroupData和自定義View的設(shè)置,GroupData需要設(shè)置薪缆,分組標題秧廉,在分組中的位置以及該分組的長度;至于如何實現(xiàn)矮燎,需要根據(jù)數(shù)據(jù)格式定義不同的邏輯定血,可以參照demo中的實現(xiàn)邏輯去獲取,該類的getItemDecoration方法诞外。
對于分割線沒啥說的澜沟,可以設(shè)置分割線的顏色和大小。
默認頭部
其中對于顯示分組頭部峡谊,有一個默認實現(xiàn)DefaultHeaderCallBack茫虽,只需要重寫分組數(shù)據(jù)即可刊苍。例如:
headerCallBack = new DefaultHeaderCallBack(this) {
@Override
public GroupData getGroupData(int position) {
//生成GroupData
return data;
}
};
注意如果添加在Adapter中添加了emptyView,那么這個時候其實是沒有數(shù)據(jù)項的濒析,所以在getGroupData方法中返回null即可
頭部點擊事件
為頭部增加點擊事件正什,其中回調(diào)中的position是當前header所在的item的實際位置。
((BaseStickyDividerItemDecoration) itemDecoration).setOnHeaderClickListener(new OnHeaderClickListener() {
@Override
public void onHeaderClicked(int position) {
//TODO
}
});
注意:在界面被銷毀時号杏,調(diào)用headerCallBack的onDestroy方法婴氮,避免內(nèi)存泄漏。
代碼混淆
-keep class net.arvin.itemdecorationhelper.**{*;}
TODO
- 優(yōu)化實現(xiàn)方式
原理
繼承ItemDecoration盾致,然后重寫getItemOffsets
和onDraw
方法主经,實現(xiàn)分割線的繪制,通過重寫onDrawOver
實現(xiàn)粘性頭部庭惜。
原理很簡單罩驻,就是首先讓itemView在你需要的方向偏移,例如left护赊,top惠遏,right,botton骏啰;然后再在onDraw
或者onDrawOver
方法中獲取到當前屏幕的view节吮,并根據(jù)他們的位置,按照偏移的邏輯在相應(yīng)區(qū)域繪制即可判耕。借用一張圖课锌,感謝【Android】RecyclerView:打造懸浮效果。
很直觀祈秕,可以看到不同內(nèi)容繪制在不同層次渺贤,位置重合的話,上層會覆蓋下層的內(nèi)容请毛。
具體的實現(xiàn)全是根據(jù)這個邏輯計算繪制志鞍。其中為了保持平分內(nèi)容,將分割線拆分方仿,如圖:感謝RecyclerView的 GridItemDecoration等分itemView
具體的難點就在這兩個位置固棚。
至于粘性頭部,核心邏輯就是對數(shù)據(jù)的分組以及頭部的偏移計算和繪制仙蚜。也是萬變不離其中此洲。具體的實現(xiàn)請參考源碼,含有一定的注釋委粉。
感謝
RecyclerView 懸浮/粘性頭部——StickyHeaderDecoration
RecyclerView的 GridItemDecoration等分itemView
在實現(xiàn)過程中參考了很多文章呜师,如果沒有注明來源的,麻煩指出來贾节,會直接加上引用來源的汁汗。
源碼
之后文章的更新都以項目的README為準衷畦。