Merging between SwipeRefreshLayout and StaggeredGridView is not easy. To make it works together, we need to do few things. Here is the way :
1. Set listener and topindex variable
1 2 3 4 5 6 | private int topIndex = 0; public class HomeFragment extends Fragment implements AbsListView.OnScrollListener, AbsListView.OnItemClickListener, OnRefreshListener { } |
Fyi, we need topIndex for detecting if gridview already on top position or not.
2. Set gridview and swiperefreshlayout together
1 2 3 4 5 6 7 8 9 10 11 12 13 | mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container); mSwipeRefreshLayout.setOnRefreshListener(this); mSwipeRefreshLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); mGridView = (StaggeredGridView) rootView.findViewById(R.id.latest_photo_gridview); mAdapter = new HomeAdapter(mContext, mPhotoList); mGridView.setAdapter(mAdapter); mGridView.setOnScrollListener(this); mGridView.setOnItemClickListener(this); |
3. Set onScroll to works together
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @Override public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) { // our handling if (!mHasRequestedMore) { int lastInScreen = firstVisibleItem + visibleItemCount; if (lastInScreen >= totalItemCount) { mHasRequestedMore = true; onLoadMoreItems(); } } boolean enable = false; // Detect if already on top of Gridview View childView = mGridView.getChildAt(0); topIndex = (childView == null) ? 0 : childView.getTop(); int index = mGridView.getFirstVisiblePosition(); if (mGridView != null && mGridView.getChildCount() > 0 && topIndex > 0 && firstVisibleItem == 0) { // check if the first item of the list is visible boolean firstItemVisible = mGridView.getFirstVisiblePosition() == 0; mSwipeRefreshLayout.setEnabled(firstItemVisible); } else { mSwipeRefreshLayout.setEnabled(enable); } } |
4. Switch swipelayout on and off and put on OnResume and OnCreate
1 2 3 4 5 | if(topIndex > 0) { mSwipeRefreshLayout.setEnabled(true); } else { mSwipeRefreshLayout.setEnabled(false); } |