RecyclerView装饰无法正确滚动

时间:2017-07-17 18:21:25

标签: java android android-recyclerview

我有一个RecyclerView,它使用简单的线条分隔符装饰。

装饰很好,除非将新物品添加到回收器的底部并滚动到视图中,装饰最初被绘制在它的最终位置,然后下方的视图滚动到位,但装饰不会滚动。

所需的行为是装饰在其起始位置绘制,然后与新项目一起滚动到位置。

以下是装饰的相关部分:

class NormalDecoration extends RecyclerView.ItemDecoration {
    private int spacing;
    private Drawable drawable;

    NormalDecoration(Context context) {
        spacing = context.getResources().getDimensionPixelOffset(R.dimen.chat_separator_height);
        drawable = ContextCompat.getDrawable(context, R.drawable.chat_divider);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        if (applySpacing(view, parent)) {
            outRect.top += spacing;
        }
    }

    boolean applySpacing(View view, RecyclerView parent) {
        int position = parent.getChildAdapterPosition(view);

        return position != -1 && position < mItems.size();
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int dividerLeft = parent.getPaddingLeft();
        int dividerRight = parent.getWidth() - parent.getPaddingRight();

        for(int index = parent.getChildCount() - 1 ; index >= 0 ; --index) {
            View view = parent.getChildAt(index);

            if(applySpacing(view, parent)) {
                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();

                int dividerTop = view.getBottom() + params.bottomMargin;
                int dividerBottom = dividerTop + spacing;

                drawable.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
                drawable.draw(c);
            }
        }
    }
}

我的适配器包含以下帮助程序:

class Adapter {
    public void add(final int index, final IChatMessageItem item) {
        mItems.add(index, item);
        notifyItemInserted(index);
    }
}

以下是我如何将项目添加到回收站,导致不可接受的滚动行为:

...
adapter.add(index, item);
layout.scrollToPosition(index);
...

1 个答案:

答案 0 :(得分:1)

您需要分别使用view.getTranslationX()getTranslationY()getAlpha()为装饰设置动画以及移动视图。

如果你只是画一个分隔符,你可能想要使用官方的support decoration,这也是上面提到的。

我还详细撰写了一篇关于此问题的文章here