martinseal1987
martinseal1987

Reputation: 2428

recycler view item decoration, getItemOffsets is only called on the last added item

I have an item decoration attached to my recycler view. It should add a large amount of padding on only the last item. This works fine. However, as I add new items, getItemOffsets is called only for the last item (and not to every item in the recycler view`). This way, I end up with this large padding on every item.

How could I remove the right padding on the rest of the views when a new view is added? I want to add items the correct way to preserve animations

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

My item offsets method:

@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;
    }
}

Upvotes: 1

Views: 1989

Answers (3)

ni032mas
ni032mas

Reputation: 321

Try call RecyclerView.invalidateItemDecorations() before insert data.

Upvotes: 2

guipivoto
guipivoto

Reputation: 18687

getItemOffsets() is called for the last item only. So, decoration for old items won't ever be re-stored. This happens because you invoked: notifyItemInserted(getItemCount() -1);

In order to call the getItemOffsets() for the last two items, you must:

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);
    }
}

Also, as yourself mentioned, you should use state.getItemCount() instead of parent.getChildAdapterPosition(view) during getItemOffsets()

Upvotes: 2

martinseal1987
martinseal1987

Reputation: 2428

I needed to use state.getItemCount() instead of parent.getChildCount()

Upvotes: 0

Related Questions