package com.progscrape.ui; import android.content.Context; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.util.AttributeSet; import android.view.View; import android.widget.ViewAnimator; import java.lang.reflect.Field; // https://code.google.com/p/android/issues/detail?id=78191 public class FixedSwipeRefreshLayout extends SwipeRefreshLayout { private Field targetField; public FixedSwipeRefreshLayout(Context context) { super(context); } public FixedSwipeRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); try { targetField = getClass().getSuperclass().getDeclaredField("mTarget"); targetField.setAccessible(true); } catch (Exception e) { // Should not happen e.printStackTrace(); } } @Override public boolean canChildScrollUp() { View target; try { target = (View) targetField.get(this); } catch (Exception e) { // Should not happen e.printStackTrace(); return super.canChildScrollUp(); } if (target instanceof ViewAnimator) { target = ((ViewAnimator)target).getCurrentView(); } if (target instanceof RecyclerView) { final RecyclerView recyclerView = (RecyclerView) target; RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); if (layoutManager instanceof LinearLayoutManager) { int position = ((LinearLayoutManager) layoutManager).findFirstCompletelyVisibleItemPosition(); return position != 0; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int[] positions = ((StaggeredGridLayoutManager) layoutManager).findFirstCompletelyVisibleItemPositions(null); for (int i = 0; i < positions.length; i++) { if (positions[i] == 0) { return false; } } } return true; } return super.canChildScrollUp(); } }