SwipeRefreshLayout с scrollView и макетом выше

у меня следующий макет

<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 только тогда, когда виден первый вид таблицы?


person user3009752    schedule 13.08.2014    source источник
comment
Пожалуйста, опубликуйте полный xml для этого макета и other_layout, так как я не вижу вашего SwipeRefreshLayout... для справки, SwipeRefreshLayout может иметь только 1 дочернее представление.   -  person sddamico    schedule 14.08.2014
comment
Я отредактировал свой вопрос. Извините за вводящую в заблуждение информацию!   -  person user3009752    schedule 14.08.2014


Ответы (4)


Я обнаружил, что если вы замените ScrollView на android.support.v4.widget.NestedScrollView, поведение прокрутки будет работать так, как вы ожидаете.

person jjnguy    schedule 12.12.2016
comment
Просто и идеально - person Angel; 04.04.2017
comment
Спас мой день. Спасибо! - person Sumit Saurabh; 09.04.2017
comment
Моя проблема немного в другом. Независимо от того, где на экране, когда я прокручиваю вниз, SwipeRefreshLayout улавливает движение, что делает невозможным прокрутку представления вниз, если только оно не находится в состоянии обновления. Или я должен сначала провести вверх, а затем вниз, не убирая палец. Ваше решение очень помогло. Спасибо. - person Phuong Dao; 05.07.2017
comment
Если вы перешли на androidX, используйте androidx.core.widget.NestedScrollView - person Kishita Variya; 29.11.2019

Сделайте свою собственную реализацию SwipeRefreshLayout и переопределите canChildScrollUp следующим образом:

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

    return false;
}

просто замените его любым подклассом ScrollView.

person Rishabh    schedule 29.09.2014
comment
где реализовать этот метод - person Gopal Singh Sirvi; 02.03.2015
comment
расширьте SwipeRefreshLayout и поместите приведенный выше код - person Rishabh; 09.12.2015
comment
Нет необходимости реализовывать пользовательский файл SwipeRefreshLayout. Мы можем просто добавить setOnChildScrollUpCallback() к SwipeRefreshLayout и поместить нашу логику в обратный вызов. - person Abhishek; 11.05.2020

Если у вас такой макет:

<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
    }
}
person Oleg Vitols    schedule 05.03.2018
comment
Если LinearLayout содержит множество других представлений с RecyclerView, то RecyclerView фактически будет вести себя как представление списка, и метод biind для всех просмотрщиков будет вызываться одновременно. - person Karan Sharma; 11.06.2021

Используйте NestedScrollView с:

     app:layout_behavior="@string/appbar_scrolling_view_behavior"
person Konstantin Antipochkin    schedule 26.02.2018