首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwipeRefreshLayout没有停止刷新

SwipeRefreshLayout没有停止刷新
EN

Stack Overflow用户
提问于 2018-06-22 06:28:31
回答 4查看 4.6K关注 0票数 5

在片段的onCreateView方法中:

代码语言:javascript
复制
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refresh();
        }
});

我的refresh()方法类似于:

代码语言:javascript
复制
public void {
    //some action

    swipeRefreshLayout.setRefreshing(false);
}

但有时swipeRefresLayout并没有停止提神。当我调试代码时,它甚至不会转到refresh()方法。

我怎么才能修好它?

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

代码语言:javascript
复制
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);
}

}

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-23 10:46:18

我想回答我自己的问题,这样如果某人犯了同样的错误,他/她就会找到解决办法。

我的问题是,有时并没有停止刷新。当我调试代码时,它甚至不会转到refresh() 方法,正如您所看到的,并不总是这样。

好吧,什么时候发生的?它发生了,cards列表是空的。

代码语言:javascript
复制
...

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

//some code here

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

...

由于它是在cards列表为空时编写的,因此它返回包含没有refreshListenerswipeRefreshLayoutview。因此,当您刷新时,不会发生任何事情,因为没有listener

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

代码语言:javascript
复制
...

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

//some code here

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

Stack Overflow用户

发布于 2018-06-22 06:44:28

代码语言:javascript
复制
  <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/listaNoticias"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="5dp" >
    <ListView>

</android.support.v4.widget.SwipeRefreshLayout>

这里是java代码的实现;

代码语言:javascript
复制
     public class classname extends Fragment implements OnRefreshListener {
    SwipeRefreshLayout swipeLayout;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.classname, container, false);

    swipeLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container);
    swipeLayout.setOnRefreshListener(this);


@Override
public void onRefresh() {
   //action
   //and set false to stop.
}
票数 2
EN

Stack Overflow用户

发布于 2018-06-22 08:11:33

只有在检测到滑动手势时才会触发SwipeRefreshLayout.OnRefreshListener,请参阅文档

当滑动手势触发刷新时调用。

但是在您的代码中,您可以通过调用:

代码语言:javascript
复制
swipeRefreshLayout.setRefreshing(true);

因此,刷新指示器从这里开始刷新,SwipeRefreshLayout.OnRefreshListener就不会被触发。如果您想在Fragment启动时开始刷新,只需在setRefreshing(true)之后立即调用refresh()

代码语言:javascript
复制
swipeRefreshLayout.setRefreshing(true);
refresh();

或者,如果您想刷新直到用户做出一个滑动手势,只需删除这一行。

代码语言:javascript
复制
swipeRefreshLayout.setRefreshing(true);

当检测到滑动手势时,您的SwipeRefreshLayout.OnRefreshListener将被触发。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50981917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档