Skip to content

Instantly share code, notes, and snippets.

@wakim
Created May 1, 2017 16:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wakim/2f4d87a6cc6d149da11c0e8df3b4e9fa to your computer and use it in GitHub Desktop.
Save wakim/2f4d87a6cc6d149da11c0e8df3b4e9fa to your computer and use it in GitHub Desktop.
Improved version of SwipeRefresh that don't trigger refresh while setEnabled is called during scroll
import android.content.Context
import android.support.v4.widget.SwipeRefreshLayout
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
/***
* Set the enabled property only when an touch up or touch cancel is detected
*/
class CustomSwipeRefreshLayout : SwipeRefreshLayout {
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context) : super(context)
var duringTouch = false
var pendingEnabled = true
val parentScrollConsumed = IntArray(2)
override fun setEnabled(enabled: Boolean) {
pendingEnabled = enabled
if (duringTouch && enabled) {
return
}
super.setEnabled(enabled)
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
val action = ev?.action ?: super.onInterceptTouchEvent(ev)
if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {
duringTouch = true
} else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
duringTouch = false
isEnabled = pendingEnabled
}
return super.onInterceptTouchEvent(ev)
}
/**
* Override onNestedScroll to ignore spinner offset when disabled
*/
override fun onNestedScroll(target: View?, dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int) {
if (isEnabled) {
super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed)
} else {
dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, parentScrollConsumed)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment