SwipeRefreshLayout and StaggeredGridView Android


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);
}

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.