У меня есть очень простой макет , но когда я звоню setRefreshing(true)
в onActivityCreated()
моем фрагменте, он не показывает на начальном этапе.
Это показывает только когда я делаю тягу, чтобы обновить. Есть идеи, почему он не появляется изначально?
Фрагмент xml:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_container"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</RelativeLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Код фрагмента:
public static class LinkDetailsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
@InjectView(R.id.swipe_container)
SwipeRefreshLayout mSwipeContainer;
public static LinkDetailsFragment newInstance(String subreddit, String linkId) {
Bundle args = new Bundle();
args.putString(EXTRA_SUBREDDIT, subreddit);
args.putString(EXTRA_LINK_ID, linkId);
LinkDetailsFragment fragment = new LinkDetailsFragment();
fragment.setArguments(args);
return fragment;
}
public LinkDetailsFragment() {
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mSwipeContainer.setOnRefreshListener(this);
mSwipeContainer.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);
mSwipeContainer.setRefreshing(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_link_details, container, false);
ButterKnife.inject(this, rootView);
return rootView;
}
@Override
public void onRefresh() {
// refresh
}
}
android
swiperefreshlayout
thunderousNinja
источник
источник
Ответы:
Столкнулся с той же проблемой. Мое решение -
источник
См. Ответ Владимира Байдалки.
Это старые обходные пути.
Это используется для работы на более раннюю версию
android.support.v4
, но с версии 21.0.0 продолжающегося он не работает и до сих пор существует сandroid.support.v4:21.0.3
выпущено на 10-12 декабре 2014 года , и это является причиной.Индикатор SwipeRefreshLayout не отображается при
setRefreshing(true)
вызове доSwipeRefreshLayout.onMeasure()
Временное решение:
призывая
setProgressViewOffset()
наSwipeRefreshLayout
что invalidtes вида окружности макета , вызывающийSwipeRefreshLayout.onMeasure()
быть вызваны немедленно.ОБНОВЛЕНИЕ Лучший обходной путь
Потому что панель действий может уменьшиться при изменении ориентации, или вы установили размер панели действий вручную. Мы устанавливаем смещение в пикселях от верхней части этого представления, при котором счетчик прогресса должен сбрасываться после успешного жеста смахивания до текущего размера панели действий.
ОБНОВЛЕНИЕ 20 ноября 2014
Если для вашего приложения не очень важно показывать SwipeRefreshLayout после запуска представления. Вы можете просто опубликовать это в будущем, используя обработчики или любую другую вещь, которую вы хотите.
Например.
или как упоминался ответ Владимира Байдалки.
Вот проблема в трекере проблем андроида. Пожалуйста, подпишите это, чтобы показать им, что нам нужно это исправить.
источник
delay time
? Я использую500
на моемGalaxy S4
. Не уверен, что это будет проблемой на другом устройстве.500
что все будет в порядке. Я проверил это на.emulator
Я просто хотел бытьsafe
с1000
миллисекундамиМое решение состоит в том, чтобы переопределить
SwipeRefreshLayout
:источник
источник
setRefreshing(false)
завершение вызоваonGlobalLayoutListener()
не отменяет индикатор загрузки.С библиотекой поддержки Android 24.2.0 проблема должна быть решена! https://developer.android.com/topic/libraries/support-library/revisions.html#24-2-0-bugfixes
источник
Судя по ответу Владимира Байдалки , это всего лишь маленькая идея, которая поможет вам поддерживать чистоту кода. Я считаю, что это заслуживает поста: вы сможете легко изменить поведение от публикации до прямого вызова метода, как только ошибка будет исправлена.
Напишите служебный класс, например:
В вашем коде замените
mSwipeContainer.setRefreshing(isRefreshing)
наUtils.setRefreshing(mSwipeContainer, isRefreshing)
: теперь только одна точка в коде должна быть изменена после исправления ошибки,Utils
класс. Метод также может быть встроен (и удален изUtils
).Обычно не будет заметной визуальной разницы. Имейте в виду, что ожидающее обновление может сохранить ваши старые
Activity
экземпляры, удерживаяSwipeRefreshLayout
их в иерархии представлений. Если это проблема, настройте метод на использованиеWeakReference
s, но обычно вы все равно не блокируете поток пользовательского интерфейса и, таким образом, задерживает gc только на пару миллисекунд.источник
Также вы можете вызвать этот метод перед setRefreshing ..
Это работает для меня.
источник
Я использовал библиотеку AppCompat
com.android.support:appcompat-v7:21.0.3
, используя тот же подход, и это сработало. Итак, вы обновляете версию этой библиотеки.Совет:
RelativeLayout
не поддерживает ориентацию, это атрибут дляLinearLayout
.Макет XML:
источник
Помимо Владимира Байдалки используйте также следующий код:
Пояснение Я реализовал решение, данное Владимиром Байдалкой (с использованием фрагментов), но после запуска swipeReferesh оно никогда не исчезало даже при вызове,
swipeContainer.setRefreshing(false);
поэтому пришлось реализовать приведенный выше код, который решил мою проблему. любые идеи, почему это происходит, приветствуются.С Уважением,
'Com.android.support:appcompat-v7:22.2.1'
источник
@ niks.stack В ответ на его ответ я покажу колесо прогресса после того, как
onLayout()
оно будет сделано. Когда я использовал его сразу послеonMeasure()
, это не учитывало некоторые из смещений, но использование его послеonLayout()
сделало.источник
Мое решение (без поддержки v7) -
источник
Я использую 'com.android.support:appcompat-v7:23.1.1'
Ранее я использовал
swipeRefreshLayout.setRefreshing(true);
внутриgetData()
метода, поэтому он не работал. Я не знаю, почему это не работает внутри метода.Хотя я использовал
swipeRefreshLayout.setRefreshing(true);
только один раз в моем фрагменте.источник
Попробуй это
mSwipeRefreshLayout.setNestedScrollingEnabled (истина);
источник
Другим обходным решением является создание нового элемента управления и производного от SwipeRefreshLayout. Переопределите функцию OnMeasure и снова включите обновление, если обновление активировано. Я использую это решение в проекте xamarin, и оно работает хорошо. Вот пример кода C #:
источник