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 не показывает никаких индикаторов обновления

По сути, он не показывает никаких признаков обновления с первой попытки.


person KVISH    schedule 28.10.2014    source источник


Ответы (6)


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

getSwipeRefreshLayout().setRefreshing(true);

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

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

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

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

getSwipeRefreshLayout().setRefreshing(false);

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

person TWiStErRob    schedule 15.11.2014
comment
Если у вас возникла эта проблема, отметьте следующую проблему: code.google. .com/p/android/issues/detail?id=77712 - person TWiStErRob; 16.11.2014

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

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

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

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

person KVISH    schedule 28.10.2014
comment
Это катастрофа. Есть НАМНОГО лучшие способы исправить эту ошибку, вместо того, чтобы хакать вещи вместе. Проголосовали против. - person Marc DiMillo; 28.05.2016
comment
Пожалуйста, прочитайте вопрос и когда я опубликовал свой ответ. В то время SwipeRefreshLayout был совершенно новым, и для него не было хороших решений. - person KVISH; 09.06.2016

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

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

person ae86    schedule 29.10.2014
comment
Это очень странно. Я использую android.widget.ListView или его подкласс везде... - person KVISH; 29.10.2014

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

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

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

Надеюсь, это хоть как-то поможет...

person Phil A    schedule 29.10.2014

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

Взгляните на https://stackoverflow.com/a/26692841/2114930.

person Maksym    schedule 02.11.2014