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