diff --git a/observablescrollview/src/main/java/com/github/ksoichiro/android/observablescrollview/ObservableRecyclerView.java b/observablescrollview/src/main/java/com/github/ksoichiro/android/observablescrollview/ObservableRecyclerView.java index e0787559..6cfffe7a 100644 --- a/observablescrollview/src/main/java/com/github/ksoichiro/android/observablescrollview/ObservableRecyclerView.java +++ b/observablescrollview/src/main/java/com/github/ksoichiro/android/observablescrollview/ObservableRecyclerView.java @@ -96,15 +96,24 @@ protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mCallbacks != null) { if (getChildCount() > 0) { - int firstVisiblePosition = getChildPosition(getChildAt(0)); - int lastVisiblePosition = getChildPosition(getChildAt(getChildCount() - 1)); + int firstVisiblePosition; + int lastVisiblePosition; + + if (getLayoutManager() instanceof LinearLayoutManager) { + LinearLayoutManager manager = (LinearLayoutManager) getLayoutManager(); + firstVisiblePosition = manager.findFirstVisibleItemPosition(); + lastVisiblePosition = manager.findLastVisibleItemPosition(); + } else { + throw new IllegalArgumentException("need to be an LinearLayoutManager child"); + } + for (int i = firstVisiblePosition, j = 0; i <= lastVisiblePosition; i++, j++) { if (mChildrenHeights.indexOfKey(i) < 0 || getChildAt(j).getHeight() != mChildrenHeights.get(i)) { mChildrenHeights.put(i, getChildAt(j).getHeight()); } } - View firstVisibleChild = getChildAt(0); + View firstVisibleChild = getChildAt(firstVisiblePosition); if (firstVisibleChild != null) { if (mPrevFirstVisiblePosition < firstVisiblePosition) { // scroll down