我需要为我的回收视图的第一个项目添加分隔符绝对。仅装饰RecyclerView的绝对第一项
我已经看过How to selectively decorate RecyclerView items,据我所知,
的(的onDraw)方法遍历所有的孩子目前在RecyclerView在屏幕上看到的景色。
和我的问题就是这样。因为每当RecycleView中的视图发生变化时,即使我只能找到并修饰第一项,只要向下滚动,装饰就会转移到当前的第一项。
在该链接中,通过查看当前孩子的ViewHolder实例的方法isDecorated
完成选择。我的猜测是,这家伙想关于ViewHolder类型,因为我在RecyclerView只有一个类型的元素是不是我的问题来装饰
这是我DividerItemDecoration.java
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public DividerItemDecoration(Drawable divider) {
mDivider = divider;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
RecyclerView.ViewHolder holder = parent.getChildViewHolder(view);
if (parent.getChildAdapterPosition(view) == 1) {
outRect.top = outRect.top + mDivider.getIntrinsicHeight();
}
return;
}
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int dividerLeft = parent.getPaddingLeft();
int dividerRight = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount - 1; i++) {
if(i==0){
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int dividerTop = child.getBottom() + params.bottomMargin;
int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();
mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
mDivider.draw(canvas);
}
}
}
}
请考虑我搜索了一整天,只能找到例子和要点添加到每个项目的装饰,有选择地添加它基于类型,但没有真正解决绝对位置。 另外,请不要像https://github.com/yqritc/RecyclerView-FlexibleDivider这样的图书馆,我想学习,不要复制。
你'parent.getChildAdapterPosition()'方法,所以得出你的“分水岭”内部'onDraw'只有在该方法返回1 – pskink
由于这个实际工作!有趣的是,我在'getItemOffset'中使用了该方法,并没有考虑在'onDraw'中重用它。不幸的是,当我切换活动(通过点击行项目)并返回时,我收到了一些奇怪的工件。分隔器略微移动。怎么来的? – MaX