Skip to content

Instantly share code, notes, and snippets.

@bhaumiknsoni
Last active August 20, 2019 00:47
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save bhaumiknsoni/77850b4369a1bd4a67ab to your computer and use it in GitHub Desktop.
Save bhaumiknsoni/77850b4369a1bd4a67ab to your computer and use it in GitHub Desktop.
Customized SwipeRefreshLayout for setting swipe distance to refresh.
package com.sungardas.viewpoint.widget;
import android.content.Context;
import android.os.Build;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewTreeObserver;
import java.lang.reflect.Field;
public class CustomSwipeToRefresh extends SwipeRefreshLayout implements ViewTreeObserver
.OnGlobalLayoutListener {
private static float MAX_SWIPE_DISTANCE_FACTOR = 0.6f;
private static int DEFAULT_REFRESH_TRIGGER_DISTANCE = 200;
private int refreshTriggerDistance = DEFAULT_REFRESH_TRIGGER_DISTANCE;
ViewTreeObserver vto;
public CustomSwipeToRefresh(Context context, AttributeSet attrs) {
super(context, attrs);
vto = getViewTreeObserver();
vto.addOnGlobalLayoutListener(this);
}
@Override
public void onGlobalLayout() {
// Calculate the trigger distance.
final DisplayMetrics metrics = getResources().getDisplayMetrics();
Float mDistanceToTriggerSync = Math.min(
((View) getParent()).getHeight() * MAX_SWIPE_DISTANCE_FACTOR,
refreshTriggerDistance * metrics.density);
try {
// Set the internal trigger distance using reflection.
Field field = SwipeRefreshLayout.class.getDeclaredField("mDistanceToTriggerSync");
field.setAccessible(true);
field.setFloat(this, mDistanceToTriggerSync);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// Only needs to be done once so remove listener.
ViewTreeObserver obs = getViewTreeObserver();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
obs.removeOnGlobalLayoutListener(this);
} else {
//noinspection deprecation
obs.removeGlobalOnLayoutListener(this);
}
}
private int getRefreshTriggerDistance() {
return refreshTriggerDistance;
}
private void setRefreshTriggerDistance(int refreshTriggerDistance) {
this.refreshTriggerDistance = refreshTriggerDistance;
}
}
@akoul889
Copy link

I used this its works like a charm.Kudos.

@Gnanendra18
Copy link

Thanks

@alisoleimani-android
Copy link

very well! thanks

@dalwadi2
Copy link

dalwadi2 commented Dec 2, 2016

Can you help me to solve this, its not worked for me.
I tried This code:

DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
        swipeContainer.setRefreshTriggerDistance(metrics.heightPixels / 2);

Help me ASAP.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment