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?
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.
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.
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
}
}
Utilisez NestedScrollView avec:
app:layout_behavior="@string/appbar_scrolling_view_behavior"