diff --git a/recyclerviewfastscroller/src/main/java/xyz/danoz/recyclerviewfastscroller/calculation/progress/VerticalLinearLayoutManagerScrollProgressCalculator.java b/recyclerviewfastscroller/src/main/java/xyz/danoz/recyclerviewfastscroller/calculation/progress/VerticalLinearLayoutManagerScrollProgressCalculator.java index 8389917..8111e9d 100644 --- a/recyclerviewfastscroller/src/main/java/xyz/danoz/recyclerviewfastscroller/calculation/progress/VerticalLinearLayoutManagerScrollProgressCalculator.java +++ b/recyclerviewfastscroller/src/main/java/xyz/danoz/recyclerviewfastscroller/calculation/progress/VerticalLinearLayoutManagerScrollProgressCalculator.java @@ -1,12 +1,16 @@ package xyz.danoz.recyclerviewfastscroller.calculation.progress; -import xyz.danoz.recyclerviewfastscroller.calculation.VerticalScrollBoundsProvider; - +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; +import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; +import java.util.Arrays; + +import xyz.danoz.recyclerviewfastscroller.calculation.VerticalScrollBoundsProvider; + /** * Calculates scroll progress for a {@link RecyclerView} with a {@link LinearLayoutManager} */ @@ -22,8 +26,26 @@ public VerticalLinearLayoutManagerScrollProgressCalculator(VerticalScrollBoundsP */ @Override public float calculateScrollProgress(RecyclerView recyclerView) { - LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); - int lastFullyVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition(); + + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + + int spanCount = 1; + int lastFullyVisiblePosition = 0; + + if (layoutManager instanceof GridLayoutManager) { + spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); + } + + if (layoutManager instanceof LinearLayoutManager) { + lastFullyVisiblePosition = ((LinearLayoutManager) layoutManager). + findLastCompletelyVisibleItemPosition(); + } else if (layoutManager instanceof StaggeredGridLayoutManager) { + int[] into = ((StaggeredGridLayoutManager) layoutManager). + findLastCompletelyVisibleItemPositions(null); + Arrays.sort(into); + lastFullyVisiblePosition = into[into.length - 1]; + spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount(); + } View visibleChild = recyclerView.getChildAt(0); if (visibleChild == null) { @@ -32,7 +54,7 @@ public float calculateScrollProgress(RecyclerView recyclerView) { ViewHolder holder = recyclerView.getChildViewHolder(visibleChild); int itemHeight = holder.itemView.getHeight(); int recyclerHeight = recyclerView.getHeight(); - int itemsInWindow = recyclerHeight / itemHeight; + int itemsInWindow = (recyclerHeight / itemHeight) * spanCount; int numItemsInList = recyclerView.getAdapter().getItemCount(); int numScrollableSectionsInList = numItemsInList - itemsInWindow;