SwipeRefreshLayout не показывает никаких индикаторов обновления

У меня есть SwipeRefreshLayout, который используется внутри фрагментов, которые отображаются в действиях. Пролистывание действительно выполняет обновление, но после того, как я потяну вниз, оно сразу возвращается вверх, и нет индикатора неопределенного прогресса (анимированные индикаторы выполнения). Он просто исчезает, но все еще вызывает onRefresh(), когда это делается. Вот мои макеты…

Схема деятельности:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    <ListView
            android:id="@+id/left_drawer"
            android:layout_width="@dimen/nav_drawer_width"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:dividerHeight="1px"
            android:background="@color/drawer_background_gray"
            android:clipToPadding="false"/>

</android.support.v4.widget.DrawerLayout>

Макет фрагмента:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        <ListView
                android:id="@android:id/list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clipToPadding="false"/>

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

    <TextView
            android:id="@android:id/empty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/empty_text_size"
            android:layout_gravity="center"
            android:gravity="center"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:textColor="@color/brand_green"/>

    <ProgressBar
            android:id="@android:id/progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminateOnly="true"
            android:visibility="gone"
            android:layout_gravity="center"/>

</FrameLayout>

Код для инициализации макета Fragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, null);
        swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container);
        swipeLayout.setOnRefreshListener(this);
        swipeLayout.setColorScheme(android.R.color.holo_blue_bright,
                android.R.color.holo_green_light,
                android.R.color.holo_orange_light,
                android.R.color.holo_red_light);
        return view;
}

Обычно при обновлении происходит задержка от 3 до 6 секунд, что достаточно, чтобы это было заметно при просмотре журнала. Он должен быть виден, и он отлично работал, когда я использовал ныне устаревшую библиотеку ActionBar-PullToRefresh. Я попытался сделать SwipeRefreshLayout корневым представлением макета фрагмента и попытался удалить пустой текст и представление прогресса, но оно по-прежнему не работает.

Есть еще несколько шагов, которые входят в мой реальный код, который я не могу раскрыть, поскольку это приложение разрабатывается для моей компании. Но это только для предоставления аналогичной базы для многих разных фрагментов, которые делают аналогичные вещи, это не должно влиять на какую-либо функциональность для этого.


person afollestad    schedule 14.05.2014    source источник
comment
Не могли бы вы отредактировать свой пост и включить свою реализацию SwipeRefreshLayout, пожалуйста? Достаточно ли времени для фактического отображения индикатора выполнения или ваши данные обновляются слишком быстро?   -  person adneal    schedule 14.05.2014
comment
@adneal только что добавил больше деталей и кода   -  person afollestad    schedule 15.05.2014
comment
Нет ничего заметно неправильного в том, что вы опубликовали или сказали, по крайней мере, из того, что я могу сказать. Вы можете попробовать реализовать некоторые фиктивные данные, чтобы увидеть, сохраняется ли проблема. Вы также можете попробовать вызвать SwipeRefreshLayout.setRefreshing(true) вместо того, чтобы потянуть вниз, чтобы проверить, будет ли отображаться индикатор выполнения таким образом. Во всяком случае, это как-то странно. Вы обязательно должны обновить свой пост, если вы можете придумать что-нибудь еще.   -  person adneal    schedule 15.05.2014
comment
@adneal хорошо, все данные снимаются с серверов моей компании, но да, я попробую вручную вызвать setRefreshing(bool), чтобы посмотреть, работает ли это   -  person afollestad    schedule 15.05.2014
comment
@adneal даже вручную с помощью setRefreshing(true) не работает. Это действительно странно.   -  person afollestad    schedule 15.05.2014
comment
У меня точно такая же проблема, как и у afollestad... My SwipeRefreshLayout обертывает listView. В методе OnRefreshListener.OnRefresh я пытаюсь включить индикатор с помощью mSwipeRefreshLayout.setRefreshing(true); Вы видите мигание индикатора на экране, но он резко выключается, хотя я никогда не вызываю mSwipeRefreshLayout.setRefreshing(false);   -  person bremen_matt    schedule 28.04.2015


Ответы (4)


Я использовал этот подход ниже, и он работал у меня без обходных путей, даже с фрагментами, после стольких попыток:

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

    <ScrollView
      android:layout_width="match_parent"
      android:layout_height="match_parent">

      ** content **

    </ScrollView>

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

Библиотека совместимости приложений: com.android.support:appcompat-v7:21.0.3.

person Jesús Castro    schedule 17.02.2015

Я обнаружил, что проблема заключается в том, что мое приложение использует полупрозрачный пользовательский интерфейс на Android 4.4, заполнение установлено в верхней части списка и в нижней части списка, чтобы оно находилось под панелью действий и над панелью навигации. Поскольку ListView становится дочерним элементом SwipeRefreshLayout, отступ должен быть установлен на SwipeRefreshLayout вместо ListView, как это было до того, как я переключился на использование SwipeRefreshLayout.

person afollestad    schedule 16.05.2014
comment
Можете ли вы сказать мне, где вы использовали cliptopadding = false? Я получаю свой круг материала обновления под панелью инструментов, и если я добавляю дополнение к swiperefreshlayout, мой recyclerView обрезается (даже с использованием cliptopadding=false) - person JavierSegoviaCordoba; 10.02.2015

Измените swipeLayout.setColorScheme() на .setColorSchemeResources (# идентификаторы ваших цветов)

person Shrini Jaiswal    schedule 24.02.2016
comment
Это не имеет отношения, и этот пост старый. - person afollestad; 24.02.2016

person    schedule
comment
Этот пост старый. :П - person afollestad; 24.02.2016