我只需要在我的回收视图的绝对第一项中添加一个分隔符。
我已阅读How to selectively decorate RecyclerView items,我理解
(onDraw)方法遍历当前在屏幕上可见的RecyclerView中的所有子视图。
我的问题正是如此。因为它每次RecycleView中的视图都会更改时执行,即使我只能找到并装饰第一个项目,一旦我向下滚动,装饰就会转移到当前的第一个项目。 / p>
在该链接中,选择由方法isDecorated
完成,该方法查看当前子项的ViewHolder的实例。我的猜测是那个人想要装饰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这样的图书馆,我想学习,不要复制。
答案 0 :(得分:0)
你可以检查它是否是第一个元素, 这是一个例子:
只需实施getItemViewType()
,并处理onCreateViewHolder()
中的viewType参数。
所以你做了类似的事情:
@Override
public int getItemViewType(int position) {
if (position == 0)
return 1;
else
return 2;
}
然后在onCreateViewHolder中根据你的viewType夸大你的不同布局。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 1) {
// inflate your first item layout & return that viewHolder
} else {
// inflate your other item layout & return that viewHolder
}
}