仅装饰RecyclerView的绝对第一项

时间:2017-04-14 09:53:15

标签: android android-recyclerview

我只需要在我的回收视图的绝对第一项中添加一个分隔符。

我已阅读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这样的图书馆,我想学习,不要复制。

1 个答案:

答案 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
    }
}