SwipeRefreshLayout无法停止刷新。

6
在一个片段的onCreateView方法内部:
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refresh();
        }
});

我的refresh()方法如下:

public void {
    //some action

    swipeRefreshLayout.setRefreshing(false);
}

但有时候swipeRefreshLayout不会停止刷新。当我调试代码时,它甚至没有进入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);
}

}


4
分享你的整个代码。 - AskNilesh
Nilesh Rathod,我已经添加了代码,你能看一下吗? - Muhammadjon
5个回答

7
我希望回答自己的问题,以便其他人能够找到解决方案,如果他/她犯了同样的错误。
我的问题是有时候 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();
    }
});

...

cards 列表为空时,它会返回一个包含 swipeRefreshLayout 但没有 refreshListenerview。因此,当你刷新时,由于没有 listener,什么也不会发生。

解决方案就是在返回 view 之前设置 listener,像这样:

...

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

//some code here

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

2
  <?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代码;
     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.
}

1

SwipeRefreshLayout.OnRefreshListener 仅在检测到滑动手势时才会触发,详见文档

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

但是在您的代码中,您通过调用以下方式开始刷新:

swipeRefreshLayout.setRefreshing(true);

所以刷新指示器从这里开始刷新,SwipeRefreshLayout.OnRefreshListener不会被触发。如果你想在你的Fragment启动时开始刷新,请在setRefreshing(true)之后立即调用refresh()

swipeRefreshLayout.setRefreshing(true);
refresh();

或者如果你想要用户进行滑动手势后才刷新界面,只需删除这行代码即可。

swipeRefreshLayout.setRefreshing(true);

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


我调用 swipeRefreshLayout.setRefreshing(true); 的原因是当片段第一次添加到活动中时,应该向服务器发送请求。然后我设置了刷新监听器,以便当用户滑动以进行刷新时,在后台发送另一个请求到服务器。 - Muhammadjon
所以第一次需要手动调用 refresh();,就在 swipeRefreshLayout.setRefreshing(true); 之后。 - Hong Duan
如果您不调用 refresh(),那么 swipeRefreshLayout 将保持刷新状态,且无法检测到滑动手势,因此它无法停止刷新。 - Hong Duan

0
您可以使用我以下所用的方法来设置运行swipeRefreshLayout的时间:
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    loadPosts(); //This is where I want to update my data
                    swipeRefreshLayout.setRefreshing(false);
                }
            }, 1000); // This is how you can choose when it will end

        }

    });

0

我遇到了不停止刷新的相同问题,在我的情况下,我忘记设置监听器。像下面这样

        viewBinding.swipeRefreshLayout.setOnRefreshListener(this)

所以,如果有人遇到相同的问题,请也看一下这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接