web-dev-qa-db-ja.com

上記のscrollViewとレイアウトを備えたSwipeRefreshLayout

次のレイアウトがあります

<Android.support.v4.widget.SwipeRefreshLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical" >

        <LinearLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:orientation="vertical" >
            //some views here
        </LinearLayout>

        <ScrollView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" >
        <TableLayout
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:stretchColumns="*" >
        </TableLayout>

    </LinearLayout>

</Android.support.v4.widget.SwipeRefreshLayout>

問題は、テーブルをスクロールダウンしたときに、swipelayoutがトリガーされているため、再びスクロールアップできないことです。テーブルの最初のビューが表示されている場合にのみ、swiperefreshをトリガーするにはどうすればよいですか?

24
user3009752

ScrollViewAndroid.support.v4.widget.NestedScrollViewに置き換えると、スクロール動作が期待どおりに機能することがわかりました。

75
jjnguy

SwipeRefreshLayoutの独自の実装を作成し、次の方法でcanChildScrollUpをオーバーライドします。

    @Override
public boolean canChildScrollUp() {
    if (scrollView != null)
        return scrollView.canScrollVertically(-1);

    return false;
}

scrollViewのサブクラスに置き換えるだけです。

8
Rishabh

次のようなレイアウトがある場合:

<SwipeRefreshLayout>
    <Android.support.v4.widget.NestedScrollView
        Android:id="@+id/your_scroll_view_id">
        <LinearLayout>
        ...
        </LinearLayout>
    </Android.support.v4.widget.NestedScrollView>
</SwipeRefreshLayout>

独自のクラスを作成し、この方法で関数をオーバーライドする必要があります。

class SwipeRefreshLayoutCustom extends SwipeRefreshLayout {
    public SwipeRefreshLayoutCustom(Context context, AttributeSet attributes) {
        super(context, attributes)
    }
    @override
    boolean canChildScrollUp() {
        return your_scroll_view_id.scrollY != 0
    }
}

NestedScrollViewを以下で使用します。

     app:layout_behavior="@string/appbar_scrolling_view_behavior"