I'm using SwipeRefreshLayout from Support Library v21. It's work perfectly with scrollable content like List or ScrollView, but is't working with static layout:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:text="Content"/>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
This code works well.
Video: Example
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center"
android:text="Content"/>
</android.support.v4.widget.SwipeRefreshLayout>
And that is not.
Video: Example
Is it possible to work with non-scrollable content in SwipeRefreshLayout?
This issue has now been fixed in version 24.2.0 of the support library.
This is a regression in version 21 of the support library, caused by the fact that the drag calculation was removed from the onTouchEvent()
callback of SwipeRefreshLayout
, and retained only in the onInterceptTouchEvent()
callback. Therefore SwipeRefreshLayout
works properly only when it intercepts touch events from a (touch consuming) child View
. Interestingly, this issue was also present when SwipeRefreshLayout
was originally introduced in version 19.1.0 of the support library, but was fixed in version 20.
I have reported this on the issue tracker at https://code.google.com/p/android/issues/detail?id=87789
This can be patched by extending SwipeRefreshLayout
and redirecting it's onTouchEvent()
callbacks to onInterceptTouchEvent()
until it returns true:
public class FixedSwipeRefreshLayout extends SwipeRefreshLayout {
public FixedSwipeRefreshLayout(Context context) {
super(context);
}
public FixedSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
private boolean handleTouch = true;
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = MotionEventCompat.getActionMasked(ev);
switch (action) {
case MotionEvent.ACTION_DOWN:
handleTouch = false;
break;
default:
if (handleTouch) {
return super.onTouchEvent(ev);
}
handleTouch = onInterceptTouchEvent(ev);
switch (action) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
handleTouch = true;
break;
}
break;
}
return true;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With