我正在使用 Support Library v21 中的 SwipeRefreshLayout。它与 List 或 ScrollView 等可滚动内容完美配合,但不适用于静态布局:

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="center"
            android:text="Content"/>
    </ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>

这段代码运行良好。

视频: Example
<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="center"
            android:text="Content"/>
</android.support.v4.widget.SwipeRefreshLayout>

而事实并非如此。

视频: Example

是否可以在 SwipeRefreshLayout 中处理不可滚动的内容?

最佳答案

更新:

此问题现已在支持库的 24.2.0 版中得到修复。

原答案:

这是支持库版本 21 中的回归,因为阻力计算是来自 onTouchEvent()SwipeRefreshLayout 回调的 removed,并且仅保留在 onInterceptTouchEvent() 回调中。因此 SwipeRefreshLayout 只有在它从(触摸消费)子 View 拦截触摸事件时才能正常工作。有趣的是,当 SwipeRefreshLayout 最初在支持库的 19.1.0 版中引入,但在 20 版中是 fixed 时,也存在此问题。

我已经在 https://code.google.com/p/android/issues/detail?id=87789 的问题跟踪器上报告了这个

这可以通过扩展 SwipeRefreshLayout 并将其 onTouchEvent() 回调重定向到 onInterceptTouchEvent() 直到它返回 true 来修补:

public class FixedSwipeRefreshLayout extends SwipeRefreshLayout {
    public FixedSwipeRefreshLayout(Context context) {
        super(context);
    }

    public FixedSwipeRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private boolean handleTouch = true;
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = MotionEventCompat.getActionMasked(ev);
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                handleTouch = false;
                break;
            default:
                if (handleTouch) {
                    return super.onTouchEvent(ev);
                }
                handleTouch = onInterceptTouchEvent(ev);
                switch (action) {
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_CANCEL:
                        handleTouch = true;
                        break;
                }
                break;
        }
        return true;
    }
}

关于android - 来自支持库的 SwipeRefreshLayout。 v21 不适用于静态内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27600815/

10-12 00:27