RecyclerView.ItemDecoration實現頂部懸浮效果
StickyDecoration
專案地址:Gavin-ZYX/StickyDecoration
標籤:
利用RecyclerView.ItemDecoration
實現頂部懸浮效果
支援
- LinearLayoutManager
- GridLayoutManager
- 點選事件
- 分割線
新增依賴
專案要求: minSdkVersion
>= 14. 在你的build.gradle
中 :
repositories { jcenter()// If not already there } dependencies { compile 'com.gavin.com.library:stickyDecoration:1.4.11' }
使用
文字懸浮——StickyDecoration
注意 使用 recyclerView.addItemDecoration()之前,必須先呼叫 recyclerView.setLayoutManager();
程式碼:
GroupListener groupListener = new GroupListener() { @Override public String getGroupName(int position) { //獲取分組名 return mList.get(position).getProvince(); } }; StickyDecoration decoration = StickyDecoration.Builder .init(groupListener) //重置 span(使用 GridLayoutManager 時必須呼叫) //.resetSpan(mRecyclerView, (GridLayoutManager) manager) .build(); ... mRecyclerView.setLayoutManager(manager); //需要在 setLayoutManager()之後呼叫 addItemDecoration() mRecyclerView.addItemDecoration(decoration);
效果:
支援的方法:
方法 | 功能 | 預設 |
---|---|---|
setGroupBackground | 背景色 | #48BDFF |
setGroupHeight | 高度 | 120px |
setGroupTextColor | 字型顏色 | Color.WHITE |
setGroupTextSize | 字型大小 | 50px |
setDivideColor | 分割線顏色 | #CCCCCC |
setDivideHeight | 分割線高寬度 | 0 |
setTextSideMargin | 邊距(靠左時為左邊距 靠右時為右邊距) | 10 |
setHeaderCount | 頭部 Item 數量(僅 LinearLayoutManager) | 0 |
方法 | 功能 | 描述 |
---|---|---|
setOnClickListener | 點選事件 | 設定點選事件,返回當前分組下第一個 item 的 position |
resetSpan | 重置 | 使用 GridLayoutManager 時必須呼叫 |
自定義 View 懸浮——PowerfulStickyDecoration
先建立佈局item_group
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
android:orientation="horizontal"
...>
<ImageView
android:id="@+id/iv"
.../>
<TextView
android:id="@+id/tv"
.../>
</LinearLayout>
建立PowerfulStickyDecoration
,實現自定View
懸浮
PowerGroupListener listener = new PowerGroupListener() {
@Override
public String getGroupName(int position) {
return mList.get(position).getProvince();
}
@Override
public View getGroupView(int position) {
//獲取自定定義的組 View
View view = getLayoutInflater().inflate(R.layout.item_group, null, false);
((TextView) view.findViewById(R.id.tv)).setText(mList.get(position).getProvince());
return view;
}
};
PowerfulStickyDecoration decoration = PowerfulStickyDecoration.Builder
.init(listener)
//重置 span(注意:使用 GridLayoutManager 時必須呼叫)
//.resetSpan(mRecyclerView, (GridLayoutManager) manager)
.build();
...
mRecyclerView.addItemDecoration(decoration);
效果:
支援的方法:
方法 | 功能 | 預設 |
---|---|---|
setGroupHeight | 高度 | 120px |
setGroupBackground | 背景色 | #48BDFF |
setDivideColor | 分割線顏色 | #CCCCCC |
setDivideHeight | 分割線高寬度 | 0 |
setCacheEnable | 是否使用快取 | 使用快取 |
setHeaderCount | 頭部 Item 數量僅 LinearLayoutManager | 0 |
方法 | 功能 | 描述 |
---|---|---|
setOnClickListener | 點選事件 | 設定點選事件,返回當前分組下第一個 item 的 position 以及對應的 viewId |
resetSpan | 重置 span | 使用 GridLayoutManager 時必須呼叫 |
notifyRedraw | 通知重新繪製 | 使用場景:網路圖片載入後呼叫方法使用) |
clearCache | 清空快取 | 在使用快取的情況下,資料改變時需要清理快取 |
Tips
1、若使用網路圖片時,在圖片載入完成後需要呼叫
decoration.notifyRedraw(mRv, view, position);
2、使用快取時,若資料來源改變,需要呼叫 clearCache 清除資料
3、點選事件穿透問題,參考 demo 中 MyRecyclerView。issue47
更新日誌
----------------------------- 1.4.8 (2018-10-9)----------------------------
- fix:由於新增 header 導致的一些問題
----------------------------- 1.4.8 (2018-08-26)----------------------------
- 頂部懸浮欄點選事件穿透問題:提供處理方案
----------------------------- 1.4.7 (2018-08-16)----------------------------
- fix:資料變化後,佈局未重新整理問題
----------------------------- 1.4.6 (2018-07-29)----------------------------
- 修改快取方式
- 加入效能檢測
----------------------------- 1.4.5 (2018-06-17)----------------------------
- 在 GridLayoutManager 中使用 setHeaderCount 方法導致佈局錯亂問題
----------------------------- 1.4.4 (2018-06-2)----------------------------
- 新增 setHeaderCount 方法
- 修改 README
- 修復 bug
----------------------------- 1.4.3 (2018-05-27)----------------------------
- 修復一些 bug,更改命名
----------------------------- 1.4.2 (2018-04-2)----------------------------
-
增強點選事件,現在可以得到懸浮條內 View 點選事件(沒有設定 id 時,返回 View.NO_ID)
-
修復載入更多返回 null 崩潰或出現多餘的懸浮 Item 問題(把載入更多放在 Item 中的載入方式)
----------------------------- 1.4.1 (2018-03-21)----------------------------
-
預設取消快取,避免資料改變時顯示出問題
-
新增 clearCache 方法用於清理快取
----------------------------- 1.4.0 (2018-03-04)----------------------------
-
支援非同步載入後的重新繪製(如網路圖片載入)
-
優化快取
-
優化 GridLayoutManager 的分割線
----------------------------- 1.3.1 (2018-01-30)----------------------------
- 修改測量方式
----------------------------- 1.3.0 (2018-01-28)----------------------------
-
刪除 isAlignLeft()方法,需要靠右時,直接在佈局中處理就可以了。
-
優化快取機制。