次のレイアウトがあります
<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をトリガーするにはどうすればよいですか?
ScrollView
をAndroid.support.v4.widget.NestedScrollView
に置き換えると、スクロール動作が期待どおりに機能することがわかりました。
SwipeRefreshLayoutの独自の実装を作成し、次の方法でcanChildScrollUpをオーバーライドします。
@Override
public boolean canChildScrollUp() {
if (scrollView != null)
return scrollView.canScrollVertically(-1);
return false;
}
scrollViewのサブクラスに置き換えるだけです。
次のようなレイアウトがある場合:
<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"