Есть ли способ программно вызвать SwipeRefreshLayout
? Должна запуститься анимация и вызвать метод onRefresh
из интерфейса OnRefreshListener
.
Программный запуск SwipeRefreshLayout
Ответы (7)
если вы используете новый swipeRefreshLayout, представленный в версии 5.0,
Как показано на изображении выше, вам просто нужно добавить следующую строку, чтобы программно активировать макет обновления смахивания.
Работа
в Яве:
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
}
});
в Котлине:
mSwipeRefreshLayout.post { mSwipeRefreshLayout.isRefreshing = true }
Не работает
если вы просто позвоните в Java:
mSwipeRefreshLayout.setRefreshing(true);
или в Котлине
mSwipeRefreshLayout.isRefreshing = true
он не вызовет анимацию круга, поэтому, добавив указанную выше строку, вы просто сделаете задержку в потоке пользовательского интерфейса, чтобы он отображал анимацию круга внутри потока пользовательского интерфейса.
При вызове mSwipeRefreshLayout.setRefreshing(true)
OnRefreshListener
НЕ будет выполнено
Чтобы остановить циклическую анимацию загрузки, вызовите mSwipeRefreshLayout.setRefreshing(false)
.setRefreshing(false)
из потока пользовательского интерфейса?
- person Zapnologica; 25.05.2015
post
больше не понадобится, как только будут выпущены библиотеки поддержки 24.
- person Marc Plano-Lesay; 09.06.2016
Чтобы запустить SwipeRefreshLayout, я попробовал это решение:
SwipeRefreshLayout.OnRefreshListener swipeRefreshListner = new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
Log.i(TAG, "onRefresh called from SwipeRefreshLayout");
// This method performs the actual data-refresh operation.
// The method calls setRefreshing(false) when it's finished.
loadData();
}
};
Ключевая часть Теперь:
swipeLayout.post(new Runnable() {
@Override public void run() {
swipeLayout.setRefreshing(true);
// directly call onRefresh() method
swipeRefreshListner.onRefresh();
}
});
Немного опоздал с потоком, но вам не нужно запускать Runnable, чтобы сделать это. Вы можете просто инициировать обновление и вызвать метод onRefresh непосредственно в onCreate или там, где вы хотите, чтобы это произошло:
class MyFragment: SwipeRefreshLayout.OnRefreshListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initViews()
}
fun initViews() {
swipe_refresh_layout?.apply {
setOnRefreshListener(this@MyFragment)
isRefreshing = true
onRefresh()
}
}
override fun onRefresh() {
// Do my refresh logic here
}
}
Просто создайте SwipeRefreshLayout.OnRefreshListener
и вызовите его функцию onRefresh()
при необходимости:
SwipeRefreshLayout srl;
SwipeRefreshLayout.OnRefreshListener refreshListener;
srl = (SwipeRefreshLayout)v.findViewById(R.id.swipeRefreshLayout);
refreshListener = new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//Do your stuff here
}
};
srl.setOnRefreshListener(refreshListener);
Теперь, всякий раз, когда вы хотите вызвать его вручную, просто вызовите его через прослушиватель
refreshListener.onRefresh();
Вы можете вызвать метод onRefresh() программно, а затем внутри метода запустить анимацию, если она еще не запущена. См. следующее:
@Override
public void onRefresh() {
if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true);
//TODO
}
Просто чтобы принудительно добавить эти два, чтобы включить жест смахивания
swipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
Log.i(TAG, "onRefresh called from SwipeRefreshLayout");
// This method performs the actual data-refresh operation.
// The method calls setRefreshing(false) when it's finished.
FetchData();
}
}
);
mSwipeRefreshLayout.setRefreshing(true);
и создать новый экземпляр моей AsyncTask, а затем выполнить его вручную. Конечно, я поместил их в метод с именемdoRefresh()
, а вonRefresh()
он вызываетdoRefresh()
. - person Xiao Liang   schedule 05.07.2014