web-dev-qa-db-fra.com

SwipeRefreshLayout avec scrollView et Layout ci-dessus

J'ai la mise en page suivante

<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>

Le problème est que lorsque je fais défiler la table, je ne peux plus faire défiler vers le haut car le swipelayout est en cours de déclenchement. Comment déclencher swiperefresh uniquement lorsque la première vue de la table est visible?

21
user3009752

J'ai constaté que si vous remplacez votre ScrollView par un Android.support.v4.widget.NestedScrollView, le comportement de défilement fonctionnera comme prévu.

61
jjnguy

Créez votre propre implémentation de SwipeRefreshLayout et remplacez canChildScrollUp de cette manière:

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

    return false;
}

remplacez simplement par n'importe quelle sous-classe de ScrollView.

8
Rishabh

Si vous avez une disposition comme celle-ci:

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

Vous devez créer votre propre classe et remplacer la fonction de cette manière:

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

Utilisez NestedScrollView avec:

     app:layout_behavior="@string/appbar_scrolling_view_behavior"
0