SwipeRefreshLayout и состояние обновления

Я борюсь с документацией в SwipeRefreshLayout библиотеки поддержки Google.

Когда я получаю вызов обновления с помощью обратного вызова, установленного setOnRefreshListener, я выполняю свое действие, и после этого я обнаружил, что мне нужно снова установить состояние обновления в false - если я НЕ сделаю этого, я никогда не смогу запустить его снова, проводя !

    mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
    if (mSwipeRefreshLayout != null) {

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                Toast.makeText(getApplication(), "Refreshing!", Toast.LENGTH_SHORT).show();
                //requestDataRefresh();
                mSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }

Все идет нормально. Но посмотрите документацию setRefreshing:

/**
 * Notify the widget that refresh state has changed. Do not call this when
 * refresh is triggered by a swipe gesture.
 *
 * @param refreshing Whether or not the view should show refresh progress.
 */
public void setRefreshing(boolean refreshing) {...

Но снова установить для состояния обновления значение false — это именно то, что я должен сделать после обновления!

Является ли документация неправильной или я вижу это неправильно? Разве документ не должен скорее сказать: «Не вызывайте это с состоянием обновления true, когда обновление запускается жестом смахивания» ??

Что вы думаете?


person Zordid    schedule 16.04.2015    source источник
comment
Нам нужно установить обновление в false вручную, как и вы, я думаю, что документы немного вводят в заблуждение!   -  person suresh    schedule 16.04.2015


Ответы (2)


Когда вы проводите пальцем по SwipeRefreshLayout сверху вниз, setRefreshing(true) запускается автоматически. Таким образом, вам не нужно повторно вызывать setRefreshing(true). Между тем, если вы назовете setRefreshing(true), но не проведете SwipeRefreshLayout, вы увидите ту же сцену, когда проведете SwipeRefreshLayout. И неважно, звоните ли вы setRefreshing(true) или проводите SwipeRefreshLayout сверху вниз, вам нужно позвонить setRefreshing(false) после того, как вы закончите свою задачу. Точно так же, как вы сделали в своем сегменте кода выше.

person SilentKnight    schedule 16.04.2015

Я думаю, что, вероятно, следует сказать, что нет необходимости вызывать это с помощью true, если ваше обновление было вызвано жестом смахивания.

Кстати, я обнаружил некоторые проблемы при обновлении пользовательского интерфейса в некоторых случаях, которые были решены путем обертывания вызова следующим образом:

private void setRefreshing(final boolean refreshing) {
        if (mSwipeRefreshLayout != null) {
            mSwipeRefreshLayout.post(new Runnable() {
                @Override
                public void run() {
                    mSwipeRefreshLayout.setRefreshing(refreshing);
                }
            });
        }
    }
person Damian    schedule 16.04.2015
comment
Спасибо! Кстати, было бы лучше с лямбдой swipeRefreshLayout.post(() -> swipeRefreshLayout.setRefreshing(refresh)); - person Moxor; 31.08.2017