package com.novoda.stickyheaderstest; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.AbsListView; import android.widget.GridView; public class StaggeredGridViewFragment extends Fragment { private static final String HEADER_VIEW_OFFSET = "com.novoda.OFFSET_KEY"; private static final int HEADER_HEIGHT_MINUS_TABS = 400; private View headerContent; private GridView grid; public StaggeredGridViewFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); headerContent = rootView.findViewById(R.id.header_content); grid = (GridView) rootView.findViewById(R.id.grid_view); grid.setOnScrollListener(makeScrollListener()); grid.setAdapter(new ImagesAdapter(getActivity())); return rootView; } private AbsListView.OnScrollListener makeScrollListener() { return new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { updateHeaderContentOffset(getHeaderContentOffset()); } }; } private void updateHeaderContentOffset(int translationY) { headerContent.setTranslationY(translationY); } private int getHeaderContentOffset() { if (isNotVisibleOrHasNotBeenLayoutYet()) { return -HEADER_HEIGHT_MINUS_TABS; } int firstVisiblePosition = grid.getFirstVisiblePosition(); return Math.max(-HEADER_HEIGHT_MINUS_TABS, Math.min(0, grid.getChildAt(firstVisiblePosition).getTop())); } private boolean isNotVisibleOrHasNotBeenLayoutYet() { return grid.getFirstVisiblePosition() > 0 || grid.getChildAt(grid.getFirstVisiblePosition()) == null; } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null && grid.getViewTreeObserver() != null) { grid.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { grid.getViewTreeObserver().removeOnPreDrawListener(this); updateHeaderContentOffset(getHeaderContentOffset()); return true; } }); } } }