我有一个布局,其中包含一个 TextView,布局顶部有一个辅助文本,后跟一个带有相关项目的 RecyclerView。
我向 RecyclerView 添加了一个 DividerItemDecoration,但它只划分(我知道,这就是它的名字)元素,而不是从 RecyclerView 的第一个元素划分辅助 TextView。
有没有办法以任何方式扩展 DividerItemDecoration 或者我需要在 TextView 和 RecyclerView 之间放置一个带有背景的空 View 元素?
使用内置类无法完成您想要的操作DividerItemDecoration。
分隔线的绘制分为两步。首先,getItemOffsets()用于向 中每个项目的底部添加空间RecyclerView。然后,onDraw()用于在该空间内绘制分隔线。
看一下源代码:
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
...
if (mOrientation == VERTICAL) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到空间仅添加到每个项目的底部(或右侧,在水平模式下)。第一个项目也没有特殊情况可以给它一个顶部偏移。
private void drawVertical(Canvas canvas, RecyclerView parent) {
...
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
parent.getDecoratedBoundsWithMargins(child, mBounds);
final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
final int top = bottom - mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(canvas);
}
...
}
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到可绘制对象的垂直边界mDivider是根据每个子视图的底部边缘计算的。
当然,您可以创建自己的 实现RecyclerView.ItemDecoration,并为列表中的第一项创建特殊情况。
编辑:这是一个精简和简化的ItemDecoration,基于DividerItemDecoration但也在第一个项目的顶部绘制了一个分隔线:https://gist.github.com/zizibaloob/0c6be3e1318257950507e9c614c8aa70
| 归档时间: |
|
| 查看次数: |
2149 次 |
| 最近记录: |