diff --git a/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/PlaceHoderHeaderLayout.java b/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/PlaceHoderHeaderLayout.java index 6a5a424..874a48b 100644 --- a/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/PlaceHoderHeaderLayout.java +++ b/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/PlaceHoderHeaderLayout.java @@ -101,8 +101,8 @@ public void updatePlaceHeight(final int placeHoderHeight, final StickHeaderViewP this.mStickHeaderViewPagerManager = stickHeaderViewPagerManager; this.mPosition = position; - if (mScrollItemView instanceof RecyclerView && ((RecyclerView) mScrollItemView).getAdapter() != null) { - placeHolderView = ((RecyclerWithHeaderAdapter) (((RecyclerView) mScrollItemView).getAdapter())).getPlaceHolderView(); + if (mScrollItemView instanceof RecyclerView && ((RecyclerView) mScrollItemView).getChildCount() > 0) { + placeHolderView = ((RecyclerView) mScrollItemView).getChildAt(0); } if (placeHolderView != null && placeHoderHeight != 0) { @@ -144,6 +144,22 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { stickHeaderViewPagerManager.onRecyclerViewScroll(recyclerView, mRecyclerViewScrollY, position, false); } }); + + if(((RecyclerView) mScrollItemView).getAdapter() != null){ + ((RecyclerView) mScrollItemView).getAdapter().registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + @Override + public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { + super.onItemRangeMoved(fromPosition, toPosition, itemCount); + checkAdapterDataObserver(); + } + + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + super.onItemRangeRemoved(positionStart, itemCount); + checkAdapterDataObserver(); + } + }); + } } else if (mScrollItemView instanceof NestingWebViewScrollView) { ((NestingWebViewScrollView) mScrollItemView).setOnScrollChangedListener(new NotifyingListenerScrollView.OnScrollChangedListener() { @Override @@ -157,7 +173,34 @@ public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) { } } + private void checkAdapterDataObserver(){ + if (((RecyclerView) mScrollItemView).getLayoutManager() != null) { + if (((RecyclerView) mScrollItemView).getLayoutManager() instanceof LinearLayoutManager) { + float recyclerViewBottom = mScrollItemView.getBottom(); + int countCount = (((RecyclerView) mScrollItemView).getLayoutManager()).getChildCount(); + if(countCount > 0){ + float lastChildViewBottom = (((RecyclerView) mScrollItemView).getLayoutManager()).getChildAt(countCount - 1).getBottom(); + float contentViewHeight = lastChildViewBottom - mScrollHeight; + if(contentViewHeight + mHeaderHeight < recyclerViewBottom){ + if(mStickHeaderViewPagerManager != null){ + mRecyclerViewScrollY = 0; + (((RecyclerView) mScrollItemView).getLayoutManager()).scrollToPosition(0); + mStickHeaderViewPagerManager.onRecyclerViewScroll((RecyclerView) mScrollItemView, mRecyclerViewScrollY, mPosition, true); + } + } + } + } else if (((RecyclerView) mScrollItemView).getLayoutManager() instanceof GridLayoutManager) { + ((GridLayoutManager) ((RecyclerView) mScrollItemView).getLayoutManager()).scrollToPositionWithOffset(0, -mRecyclerViewScrollY); + } + } + } + + int mScrollHeight; + int mHeaderHeight; + public void adjustScroll(int scrollHeight, int headerHeight) { + this.mScrollHeight = scrollHeight; + this.mHeaderHeight = headerHeight; if (mScrollItemView == null) return; if (mScrollItemView instanceof ListView) { diff --git a/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/StickHeaderLayout.java b/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/StickHeaderLayout.java index 3129929..76f3b2d 100644 --- a/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/StickHeaderLayout.java +++ b/StickHeaderLayout/library/src/main/java/com/stickheaderlayout/StickHeaderLayout.java @@ -166,10 +166,8 @@ private void updatePlaceHeight() { if (mStickHeaderHeight != 0 && mStickViewHeight != 0) { mMinHeaderTranslation = -mStickHeaderHeight + mStickViewHeight; - if (mScrollItemView instanceof RecyclerView) { - if (((RecyclerView) mScrollItemView).getAdapter() != null) { - placeHolderView = ((RecyclerWithHeaderAdapter) (((RecyclerView) mScrollItemView).getAdapter())).getPlaceHolderView(); - } + if (mScrollItemView instanceof RecyclerView && ((RecyclerView) mScrollItemView).getChildCount() > 0) { + placeHolderView = ((RecyclerView) mScrollItemView).getChildAt(0); } if (placeHolderView != null) {