SwipeRefreshLayout在两个方向?

时间:2015-03-21 11:20:57

标签: android

我喜欢新的SwipeRefreshLayout!它看起来很棒,而且非常容易使用。 但我想在两个方向上使用它。我有一个消息屏幕,我想 通过从上到下滑动来加载旧消息,我想通过从下到上滑动来加载更新的消息。

此示例:http://www.bignerdranch.com/blog/implementing-swipe-to-refresh/ 很容易解释如何从上到下滑动,但我怎样才能实现两个方向?

1 个答案:

答案 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; 

请注意,我不推荐这种方法。它不是标准的界面,没有人会期望它以那种令人困惑的方式工作。在自定义布局中覆盖此方法还存在额外的风险,即当新版本出现并且您想要升级时,您可能必须重做所有内容。