Android 程式設計下如何調整 SwipeRefreshLayout 的下拉重新整理距離

sunzn發表於2014-06-18

SwipeRefreshLayout 的下拉重新整理距離比較短,並且也沒有提供設定下拉距離的 API,但是看 SwipeRefreshLayout 的原始碼,會發現有一個內部變數 mDistanceToTriggerSync,這個變數決定了觸發重新整理的下拉距離。下面的程式碼展示了原始碼中是如何給這個變數賦值的:

final DisplayMetrics metrics = getResources().getDisplayMetrics();
mDistanceToTriggerSync = (int) Math.min(((View) getParent()).getHeight() * MAX_SWIPE_DISTANCE_FACTOR, REFRESH_TRIGGER_DISTANCE * metrics.density);

上面使用了父檢視高度和一些常數計算來決定觸發距離。MAX_SWIPE_DISTANCE_FACTOR (0.6) 和 REFRESH_TRIGGER_DISTANCE (120) 是私有常量,這些都是我們無法直接修改的。但是,我們可以通過反射的方法來重新計算 mDistanceToTriggerSync 的數值,程式碼如下:

ViewTreeObserver vto = swipeLayout.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    public void onGlobalLayout() {

        final DisplayMetrics metrics = getResources().getDisplayMetrics();
        Float mDistanceToTriggerSync = Math.min(((View) swipeLayout.getParent()).getHeight() * 0.6f, 500 * metrics.density);

        try {
            Field field = SwipeRefreshLayout.class.getDeclaredField("mDistanceToTriggerSync");
            field.setAccessible(true);
            field.setFloat(swipeLayout, mDistanceToTriggerSync);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ViewTreeObserver obs = swipeLayout.getViewTreeObserver();
        obs.removeOnGlobalLayoutListener(this);
    }
});

對比下程式碼,只是將 REFRESH_TRIGGER_DISTANCE (120) 的數值改為了 500,就會發現下拉重新整理的距離明顯增大了,另附程式碼下載:SwipeRefreshLayout.rar

相關文章