首页 > 解决方案 > SwipeRefreshLayout 没有停止刷新

问题描述

onCreateView片段的内部方法:

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refresh();
        }
});

我的refresh()方法是这样的:

public void {
    //some action

    swipeRefreshLayout.setRefreshing(false);
}

但有时swipeRefresLayout是不会停止刷新。当我调试代码时,它甚至没有refresh()方法。

我该如何解决?

编辑: 更清晰的代码在这里:

public class VisaCardsFragment extends Fragment {

@Bind(R.id.swipe_refresh_layout)
SwipeRefreshLayout swipeRefreshLayout;

@Bind(R.id.recycler_view_visa_cards)
RecyclerView recyclerViewVisaCards;

@Bind(R.id.text_view_message)
TextView textViewMessage;

private List<Card> cards;
private List<VisaCard> visaCards;
private VisaCardsAdapter adapter;


public VisaCardsFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_visa_cards, container, false);
    setHasOptionsMenu(true);
    ButterKnife.bind(this, view);

    visaCards = new ArrayList<>();
    adapter = new VisaCardsAdapter(visaCards);
    recyclerViewVisaCards.setAdapter(adapter);
    recyclerViewVisaCards.setHorizontalScrollBarEnabled(true);
    recyclerViewVisaCards.setLayoutManager(new LinearLayoutManager(VisaCardsFragment.this.getActivity(), LinearLayoutManager.VERTICAL, false));


    cards = Card.getActiveCards();
    if (cards.isEmpty()) {
        showMessage("Cards unavailable");
        return view;
    }

    swipeRefreshLayout.setRefreshing(true);
    getVisaResponse(); // method containing server request (RESTful) to get visa cards (VisaCard) using the data of cards (Card)


    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refresh();
        }
    });

    return view;
}

public void refresh() {
    hideMessage();
    cards = Card.getActiveCards();
    if (cards.isEmpty()) {
        clearList();
        swipeRefreshLayout.setRefreshing(false);
        showMessage("Visa cards not found");
        return;
    }
    getVisaResponse();// method containing server request (RESTful) to get visa cards (VisaCard) using the data of cards (Card)
}

public void showMessage(String message) {
    textViewMessage.setText(message);
    textViewMessage.setVisibility(View.VISIBLE);
}

public void hideMessage() {
    textViewMessage.setText("");
    textViewMessage.setVisibility(View.GONE);
}

}

标签: android

解决方案


我想回答我自己的问题,以便有人会找到解决方案,如果他/她犯了同样的错误。

我的问题是有时swipeRefresLayout不会停止刷新。当我调试代码时,它甚至没有refresh()方法。如您所见,并非总是如此。

好的,什么时候发生的?事情发生了,cards清单是空的。

...

cards = Card.getActiveCards();
if (cards.isEmpty()) {
    showMessage("Cards unavailable");
    return view;
}

//some code here

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        refresh();
    }
});

...

正如它在cardslist 为空时所写的那样,它返回view包含swipeRefreshLayoutwithout refreshListener。因此,当您刷新时,没有任何反应,因为没有listener.

解决方案是listener在返回之前进行设置view,如下所示:

...

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        refresh();
    }
});

//some code here

cards = Card.getActiveCards();
if (cards.isEmpty()) {
    showMessage("Cards unavailable");
    return view;
}
...

推荐阅读