我在回收者视图中附加了一件装饰品。它应该仅在最后一项上添加大量填充。这很好。但是,当我添加新项目时,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;
}
}
答案 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()。