是否有可能在向下滑动时禁用SwipeRefreshLayout
的拖动动画,而无需进行类自定义?
是否有可能在向下滑动时禁用SwipeRefreshLayout
的拖动动画,而无需进行类自定义?
尝试拨打:
setEnabled(false)
在您的SwipeRefreshLayout视图上。setRefreshing(true)
方法以编程方式显示刷新动画。 - carloshwaListView
。我仍然可以点击列表视图中的项目,将它们向侧面滑动等操作,而且ListView
的行为就像没有SwipeRefreshLayout
一样。 - Lahiru ChandimasetRefreshing(true)
时遇到问题,支持库的24.2.0版本修复了一个错误:
https://code.google.com/p/android/issues/detail?id=77712 - carloshwaWell, disabling SwipeLayoutAnimanion appeared to be a rather simple task, but it involves replication of android.support.v4.widget.SwipeRefreshLayout
class inside one's project.
Diving in source code will reveal, that SwipeRefreshLayout
consists of three classes:
All three classes should be included in the project. Then SwipeRefreshLayout
can be customized as follows:
Add a new public method which will control either layout should follow the swipe down gesture or not:
private boolean mLayoutMovementEnabled = true;
public void setLayoutMovementEnabled(boolean enabled) {
mLayoutMovementEnabled = enabled;
}
All related computations are performed inside onTouchEvent()
. To disable layout following the movement,
updateContentOffsetTop((int) (offsetTop));
string should be changed to
if (mLayoutMovementEnabled) updateContentOffsetTop((int) (offsetTop));
The complete modified routine is below.
@Override
public boolean onTouchEvent(MotionEvent event) {
final int action = event.getAction();
boolean handled = false;
switch (action) {
case MotionEvent.ACTION_DOWN:
mCurrPercentage = 0;
mDownEvent = MotionEvent.obtain(event);
mPrevY = mDownEvent.getY();
break;
case MotionEvent.ACTION_MOVE:
if (mDownEvent != null && !mReturningToStart) {
final float eventY = event.getY();
float yDiff = eventY - mDownEvent.getY();
if (yDiff > mTouchSlop) {
// User velocity passed min velocity; trigger a refresh
if (yDiff > mDistanceToTriggerSync) {
// User movement passed distance; trigger a refresh
startRefresh();
handled = true;
break;
} else {
// Just track the user's movement
setTriggerPercentage(
mAccelerateInterpolator.getInterpolation(
yDiff / mDistanceToTriggerSync));
float offsetTop = yDiff;
if (mPrevY > eventY) {
offsetTop = yDiff - mTouchSlop;
}
if (mLayoutMovementEnabled) updateContentOffsetTop((int) (offsetTop));
if (mPrevY > eventY && (mTarget.getTop() < mTouchSlop)) {
// If the user puts the view back at the top, we
// don't need to. This shouldn't be considered
// cancelling the gesture as the user can restart from the top.
removeCallbacks(mCancel);
} else {
updatePositionTimeout();
}
mPrevY = event.getY();
handled = true;
}
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (mDownEvent != null) {
mDownEvent.recycle();
mDownEvent = null;
}
break;
}
return handled;
}
禁用滑动的简单方法之一是将触发同步的距离设置为无法达到的高值。
mSwipeLayout.setDistanceToTriggerSync(999999);