Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Removing divider after a footer in a Recyclerview

Is there any way to removing divider after a footer in a Recyclerview.I am using item decoration to add divider to the adapter.I am adding footer in the adapter.divider is showing below the footer also.i want to remove it.

This is my code for Divider

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private static final int[] ATTRS = new int[]{
        android.R.attr.listDivider
};

public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

private Drawable mDivider;

private int mOrientation;

public DividerItemDecoration(Context context, int orientation) {
    final TypedArray a = context.obtainStyledAttributes(ATTRS);
    mDivider = a.getDrawable(0);
    a.recycle();
    setOrientation(orientation);
}

public void setOrientation(int orientation) {
    if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
        throw new IllegalArgumentException("invalid orientation");
    }
    mOrientation = orientation;
}

@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    if (mOrientation == VERTICAL_LIST) {
        drawVertical(c, parent);
    } else {
        drawHorizontal(c, parent);
    }
}

public void drawVertical(Canvas c, RecyclerView parent) {
    final int left = parent.getPaddingLeft();
    final int right = parent.getWidth() - parent.getPaddingRight();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                .getLayoutParams();
        final int top = child.getBottom() + params.bottomMargin;
        final int bottom = top + mDivider.getIntrinsicHeight();
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

public void drawHorizontal(Canvas c, RecyclerView parent) {
    final int top = parent.getPaddingTop();
    final int bottom = parent.getHeight() - parent.getPaddingBottom();

    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                .getLayoutParams();
        final int left = child.getRight() + params.rightMargin;
        final int right = left + mDivider.getIntrinsicHeight();
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

@Override
public void getItemOffsets(Rect rect, View view, RecyclerView parent, RecyclerView.State state) {
    if (Orientation == VERTICAL_LIST) {
        rect.set(0, 0, 0, Divider.getIntrinsicHeight());
    } else {
        rect.set(0, 0, Divider.getIntrinsicWidth(), 0);
    }}
like image 342
Shikha Ratra Avatar asked Apr 28 '16 05:04

Shikha Ratra


1 Answers

You have to add a check on getItemOffsets() method:

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
        // set the rect's size
    }
}

You can find an example of this implementation on my RecyclerViewDivider library on Github

Or you can simply add it as a Gradle dependency and check the javadoc:

dependencies {
    ...
    compile 'com.github.fondesa:recycler-view-divider:1.1.3'
}

And use:

RecyclerViewDivider.with(context)
        .addTo(recyclerView)
        .visibilityFactory(new VisibilityFactory() {
            @Override
            public boolean displayDividerForItem(int listSize, int position) {
                return position != listSize - 1;
            }
        })
        .build()
        .attach()
like image 76
Giorgio Antonioli Avatar answered Nov 30 '22 19:11

Giorgio Antonioli