回收者视图项装饰,仅在最后添加的项上调用getItemOffsets

时间:2019-05-23 14:00:17

标签: android android-recyclerview item-decoration

我在回收者视图中附加了一件装饰品。它应该仅在最后一项上添加大量填充。这很好。但是,当我添加新项目时,getItemOffsets仅针对最后一个项目(而不是回收者视图中的每个项目)调用。这样,我最终在每个项目上都做了这么大的填充。

添加新视图后,如何删除其余视图的正确填充?我想以正确的方式添加项目以保存动画

public void onItemInserted(Card card, int position){
    cardList.add(card);
    notifyItemInserted(getItemCount() -1);
}

我的商品抵销方法:

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
    super.getItemOffsets(outRect, view, parent, state);
    outRect.top = horizontalSpace;
    outRect.bottom = horizontalSpace;
    outRect.left = horizontalSpace;
    outRect.right = 0;

    if (parent.getChildAdapterPosition(view) == parent.getChildCount() - 1){
       outRect.right = endSpace;
    }
}

3 个答案:

答案 0 :(得分:2)

getItemOffsets()仅用于最后一项。因此,旧物品的装饰将永远不会被存储。发生这种情况是因为您调用了:notifyItemInserted(getItemCount() -1);

要为最后两项调用getItemOffsets(),您必须:

public void onItemInserted(){
    items++;
    int lastPosition = getItemCount() - 1;
    if(lastPosition > 0) {
        // Request to redraw last two items. So, new item will receive proper padding and old item will restore to the default position
        notifyItemRangeChanged(lastPosition - 1, lastPosition);
    } else {
        notifyItemChanged(lastPosition);
    }
}

此外,正如您自己提到的,在state.getItemCount()期间,您应该使用parent.getChildAdapterPosition(view)而不是getItemOffsets()

答案 1 :(得分:0)

我需要使用state.getItemCount()而不是parent.getChildCount()

答案 2 :(得分:0)

在插入数据之前尝试调用RecyclerView.invalidateItemDecorations()。