public void updateStickyView() { mSticky = findViewWithTag("sticky"); mStickyContainer = findViewWithTag("stickyContainer"); }
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (mSticky == null) { updateStickyView(); } updateStickyHeaderPosition(); }
@Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); updateStickyHeaderPosition(); }
private void updateStickyHeaderPosition() { // Note: for pre-Honeycomb the header will not be moved, so this ScrollView essentially // behaves like a normal BottomScrollView. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { if (mSticky != null) { // The view to draw when sticking to the top final View drawTarget = mStickyContainer != null ? mStickyContainer : mSticky; // The offset to draw the view at when sticky final int drawOffset = mStickyContainer != null ? mSticky.getTop() : 0; // Position of the draw target, relative to the outside of the scrollView final int drawTop = drawTarget.getTop() - getScrollY(); if (drawTop + drawOffset < mStatusBarInset || !drawTarget.isShown()) { // ScrollView translates the whole canvas so we have to compensate for that drawTarget.setTranslationY(getScrollY() - drawOffset); } else { drawTarget.setTranslationY(0); } } } }
@Override @TargetApi(Build.VERSION_CODES.LOLLIPOP) public WindowInsets onApplyWindowInsets(WindowInsets insets) { if (getFitsSystemWindows()) { mStatusBarInset = insets.getSystemWindowInsetTop(); insets = insets.replaceSystemWindowInsets( insets.getSystemWindowInsetLeft(), 0, /* top */ insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom() ); } return insets; } }