Программный запуск SwipeRefreshLayout

Есть ли способ программно вызвать SwipeRefreshLayout? Должна запуститься анимация и вызвать метод onRefresh из интерфейса OnRefreshListener.


person Niklas    schedule 05.07.2014    source источник
comment
Ну, это кажется невозможным. В моем случае мне нужно вызвать mSwipeRefreshLayout.setRefreshing(true); и создать новый экземпляр моей AsyncTask, а затем выполнить его вручную. Конечно, я поместил их в метод с именем doRefresh(), а в onRefresh() он вызывает doRefresh().   -  person Xiao Liang    schedule 05.07.2014
comment
Возможный дубликат Как запустить swiperefreshlayout в Android?   -  person opticod    schedule 19.12.2016
comment
@opticod как вопрос, который был задан раньше, чем «возможный» дубликат, является дубликатом?   -  person Niklas    schedule 19.12.2016


Ответы (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)

person Ramz    schedule 17.01.2015
comment
Мне нравится, что в документах нет упоминания об этом? У меня были бесконечные проблемы с тем, что знак загрузки не отображался. Можно ли вызвать .setRefreshing(false) из потока пользовательского интерфейса? - person Zapnologica; 25.05.2015
comment
@Zapnologica: Да, можешь. Я вызываю его из onPostExecute моей AsyncTask, которая была запущена в onRefresh(). - person AgentKnopf; 04.06.2015
comment
@Ramz Я попробовал ваш фрагмент - счетчик показывает, но, в отличие от того, что вы упомянули, обратный вызов onRefresh, реализованный моим фрагментом, не вызывается, когда я вручную вызываю setRefreshing (true), как вы (Motorola Moto X 2014 Android 5+). Поэтому я должен настроить счетчик на обновление и вручную вызвать обратный вызов onRefresh для выполнения моего кода обновления. - person AgentKnopf; 04.06.2015
comment
OnRefreshListener НЕ БУДЕТ выполняться после mSwipeRefreshLayout.setRefreshing(true)... Вы должны это исправить - person yat0; 28.08.2015
comment
Я думаю, что это ошибка в SwipeRefreshLayout, в этом классе есть частный метод setRefreshing (логическое обновление, логическое уведомление), который позволяет вам контролировать, уведомлять ли вашего слушателя, но setRefreshing (логическое обновление) передает false этому частному методу, это почему нашему слушателю никогда не звонят. - person hac.jack; 14.01.2016
comment
Связанная проблема с трекером Android: code.google.com/p/android/ вопросы/подробности?id=77712. TL;DR: 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();
   }
});
person Min2    schedule 25.02.2016
comment
Как упоминалось в одном из комментариев к предыдущему ответу hac.jack, похоже, возникла ошибка с SwipeRefreshLayout. Существует внутренний метод setRefreshing(логическое обновление, логическое уведомление), который вызывается setRefreshing(логическое обновление). По умолчанию для параметра уведомления установлено значение false, поэтому OnRefreshListener никогда не обновляется. Этот ответ правильный, чтобы обновить слушателя. - person Zac; 07.03.2016
comment
swipeRefreshLayout.setOnRefreshListener( new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { Log.i(TAG, onRefresh вызывается из SwipeRefreshLayout); // Этот метод выполняет фактическую операцию обновления данных. // Метод вызывает setRefreshing( false) по завершении. FetchData(); } } ); - person Goodlife; 07.09.2016

Немного опоздал с потоком, но вам не нужно запускать 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
    }
}
person Indiana    schedule 08.01.2020

Просто создайте 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();
person Aman Raj Sundram    schedule 15.06.2020

Вы можете вызвать метод onRefresh() программно, а затем внутри метода запустить анимацию, если она еще не запущена. См. следующее:

@Override
public void onRefresh() {
    if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true);
    //TODO
}
person Community    schedule 12.10.2016

Просто чтобы принудительно добавить эти два, чтобы включить жест смахивания

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();
        }
    }
);
person Goodlife    schedule 07.09.2016

person    schedule
comment
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. Также старайтесь не перегружать свой код пояснительными комментариями, это снижает читабельность как кода, так и пояснений! - person Rohan Khude; 30.05.2019