我喜欢新的SwipeRefreshLayout!它看起来很棒,而且非常容易使用。 但我想在两个方向上使用它。我有一个消息屏幕,我想 通过从上到下滑动来加载旧消息,我想通过从下到上滑动来加载更新的消息。
此示例:http://www.bignerdranch.com/blog/implementing-swipe-to-refresh/ 很容易解释如何从上到下滑动,但我怎样才能实现两个方向?
答案 0 :(得分:1)
根据源代码https://github.com/futuresimple/android-support-v4/blob/master/src/java/android/support/v4/widget/SwipeRefreshLayout.java,它只收听垂直更改(请参阅public boolean onTouchEvent(MotionEvent event)
)。
您应该能够覆盖该类并自行实施此覆盖,以使其能够听取水平和垂直滑动,但我不认为有任何开箱即用的功能可以让您这样做
应该最感兴趣的是:
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;
}
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;
请注意,我不推荐这种方法。它不是标准的界面,没有人会期望它以那种令人困惑的方式工作。在自定义布局中覆盖此方法还存在额外的风险,即当新版本出现并且您想要升级时,您可能必须重做所有内容。