Триггер SwipeRefreshLayout программно
Есть ли способ вызвать SwipeRefreshLayout
программно? Анимация должна начаться и onRefresh
метод из OnRefreshListener
интерфейс должен быть вызван.
4 ответа
Если вы используете новый swipeRefreshLayout, введенный в 5.0
Как показано на рисунке выше, вам просто нужно добавить следующую строку, чтобы программно запустить макет обновления смахивания
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
}
});
если вы просто позвоните
mSwipeRefreshLayout.setRefreshing(true);
он не вызовет анимацию круга, поэтому, добавив вышеприведенную строку, вы просто делаете задержку в потоке пользовательского интерфейса, чтобы показать анимацию круга в потоке пользовательского интерфейса.
По телефону mSwipeRefreshLayout.setRefreshing(true)
OnRefreshListener
НЕ будет казнен
Для остановки круговой загрузки анимации вызов mSwipeRefreshLayout.setRefreshing(false)
Чтобы активировать 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();
}
});
Просто создайте 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();
Немного поздно для потока, но вам не нужно запускать 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
}
}
binding.swipeRefreshLayout.setRefreshing(true); // show loading
binding.swipeRefreshLayout.post(this::updateUI); // call method
binding.swipeRefreshLayout.setOnRefreshListener(this::updateUI); // call method
Вы можете вызвать метод onRefresh() программно, а затем внутри метода запустить анимацию, если она еще не запущена. Смотрите следующее:
@Override
public void onRefresh() {
if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true);
//TODO
}
Просто чтобы заставить это добавить два к Ennable жестом пальцем
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();
}
}
);