Триггер 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();
        }
    }
);
Другие вопросы по тегам