public
class
SectionDecoration
extends
RecyclerView
.
ItemDecoration
{
private
static
final
String
TAG
=
"SectionDecoration"
;
private
List
dataList
;
private
DecorationCallback
callback
;
private
TextPaint
textPaint
;
private
Paint
paint
;
private
int
topGap
;
private
int
alignBottom
;
private
Paint
.
FontMetrics
fontMetrics
;
public
SectionDecoration
(
List
dataList
,
Context
context
,
DecorationCallback
decorationCallback
)
{
Resources
res
=
context
.
getResources
();
this
.
dataList
=
dataList
;
this
.
callback
=
decorationCallback
;
//设置悬浮栏的画笔---paint
paint
=
new
Paint
();
paint
.
setColor
(
res
.
getColor
(
R
.
color
.
colorGray
));
//设置悬浮栏中文本的画笔
textPaint
=
new
TextPaint
();
textPaint
.
setAntiAlias
(
true
);
textPaint
.
setTextSize
(
DensityUtil
.
dip2px
(
context
,
14
));
textPaint
.
setColor
(
Color
.
DKGRAY
);
textPaint
.
setTextAlign
(
Paint
.
Align
.
LEFT
);
fontMetrics
=
new
Paint
.
FontMetrics
();
//决定悬浮栏的高度等
topGap
=
res
.
getDimensionPixelSize
(
R
.
dimen
.
sectioned_top
);
//决定文本的显示位置等
alignBottom
=
res
.
getDimensionPixelSize
(
R
.
dimen
.
sectioned_alignBottom
);
}
@Override
public
void
getItemOffsets
(
Rect
outRect
,
View
view
,
RecyclerView
parent
,
RecyclerView
.
State
state
)
{
super
.
getItemOffsets
(
outRect
,
view
,
parent
,
state
);
int
pos
=
parent
.
getChildAdapterPosition
(
view
);
Log
.
i
(
TAG
,
"getItemOffsets:"
+
pos
);
String
groupId
=
callback
.
getGroupId
(
pos
);
if
(
groupId
.
equals
(
"-1"
))
return
;
//只有是同一组的第一个才显示悬浮栏
if
(
pos
==
0
||
isFirstInGroup
(
pos
))
{
outRect
.
top
=
topGap
;
if
(
dataList
.
get
(
pos
).
getName
()
==
""
)
{
outRect
.
top
=
0
;
}
}
else
{
outRect
.
top
=
0
;
}
}
@Override
public
void
onDraw
(
Canvas
c
,
RecyclerView
parent
,
RecyclerView
.
State
state
)
{
super
.
onDraw
(
c
,
parent
,
state
);
int
left
=
parent
.
getPaddingLeft
();
int
right
=
parent
.
getWidth
()
-
parent
.
getPaddingRight
();
int
childCount
=
parent
.
getChildCount
();
for
(
int
i
=
0
;
i
childCount
;
i
++
)
{
View
view
=
parent
.
getChildAt
(
i
);
int
position
=
parent
.
getChildAdapterPosition
(
view
);
String
groupId
=
callback
.
getGroupId
(
position
);
if
(
groupId
.
equals
(
"-1"
))
return
;
String
textLine
=
callback
.
getGroupFirstLine
(
position
).
toUpperCase
();
if
(
textLine
==
""
)
{
float
top
=
view
.
getTop
();
float
bottom
=
view
.
getTop
();
c
.
drawRect
(
left
,
top
,
right
,
bottom
,
paint
);
return
;
}
else
{
if
(
position
==
0
||
isFirstInGroup
(
position
))
{
float
top
=
view
.
getTop
()
-
topGap
;
float
bottom
=
view
.
getTop
();
//绘制悬浮栏
c
.
drawRect
(
left
,
top
-
topGap
,
right
,
bottom
,
paint
);
//绘制文本
c
.
drawText
(
textLine
,
left
,
bottom
,