簡體   English   中英

RecyclerView裝飾無法正確滾動

[英]RecyclerView Decoration doesn't scroll correctly

我有一個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);
...

您需要分別使用view.getTranslationX()getTranslationY()getAlpha()來使裝飾隨着視圖移動而動畫化。

如果僅畫一個分隔線,則可能需要使用官方支持的裝飾物 ,該裝飾物也可以執行上述操作。

我也在這里詳細寫了一篇文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM