Подтвердить что ты не робот

SwipeRefreshLayout в API 21

Я ранее использовал API 19 и использовал SwipeRefreshLayout для многих моих фрагментов. Когда я загружал контент в первый раз ранее, я использовал setRefreshing(true); и смог загрузить контент, и он работал нормально.

Я вижу в Android 5.0 Google использует круговой обзор прогресса. Когда я звоню setRefreshing(true);, теперь он просто не действует. Есть ли способ программно показать новый счетчик? Я добрался до этого совсем немного, но не смог программно показать его. Я прочитал следующее:

http://developer.android.com/tools/support-library/index.html

https://yassirh.com/2014/05/how-to-use-swiperefreshlayout-the-right-way/

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

В принципе, он не показывает никаких признаков обновления при первой попытке.

4b9b3361

Ответ 1

Вместо прямой установки

getSwipeRefreshLayout().setRefreshing(true);

вы можете задержать его в потоке пользовательского интерфейса для более позднего

getSwipeRefreshLayout().post(new Runnable() {
    @Override public void run() {
        getSwipeRefreshLayout().setRefreshing(true);
    }
});

это отлично работает для начала загрузки в onCreateView, и если это сделано в LoaderManager.LoaderCallbacks тоже.

Я не видел, чтобы индикатор выполнения был случайно вставлен (потому что загрузка данных слишком быстрая), но если вы подозреваете, что нагрузка может вернуться слишком рано (ошибка?) , стоит сделать то же сообщение для

getSwipeRefreshLayout().setRefreshing(false);

Таким образом, два post будут обязательно проходить один за другим, что приведет к определенному скрытому прогрессу.

Ответ 2

Это не очень чистое решение, но сейчас оно работает. setRefreshing(boolean) представление прогресса находится за панелью действий. Решение состоит в том, чтобы нажать его:

    Display display = getActivity().getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int height = size.y;
    getSwipeRefreshLayout().setProgressViewOffset(false, -200, height / 9);

Если у вас есть лучшее решение, отправьте его ниже, и я приму это!

Пожалуйста, не используйте это решение, принятый ответ лучше.

Ответ 3

Я столкнулся с той же проблемой, но только в случае использования StickyListHeadersListView. Используя android.widget.ListView, все в порядке.

Я думаю, что в api 21 Google переписал класс Listview. Если вы используете подкласс Listview, я думаю, вам может понадобиться сделать subclass exends android.widget.ListView в api 21.

Ответ 4

Что вы должны помнить, так это то, что Material Design SwipeRefreshLayout изменился, в то время как старый использовал BakedBezierInterpolator, но новый использует "перетаскиваемый в позицию" прогресс spinner

К сожалению, API 21 больше не включает BakedBezierInterpolator, поэтому, с моей точки зрения, у вас есть 2 варианта: 1) сдвиньте счетчик вниз (и не забудьте переставить его обратно) 2) сделайте свой собственный счетчик, чтобы сидеть на экране, когда вы первоначально загружаете данные.

Если вы хотите, чтобы ваш счетчик был таким же, тогда определенно используйте SwipeRefreshLayout, но убедитесь, что вы не забыли переставить его

Надеюсь, это поможет в некотором роде...

Ответ 5

Вы можете попытаться вызвать метод измерения (int, int) до setRefreshing (true)

Взгляните на fooobar.com/questions/293725/....