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