我已经实现了一个包含SwipeRefreshLayout作为内容视图的片段。刷新动画在onRefresh处触发,但即使从服务器检索数据后setRefreshing设置为false,它也永远不会停止。
@Override
public void onRefresh() {
handler.post(refreshing);
}
private final Runnable refreshing = new Runnable(){
public void run(){
try {
if(isRefreshing()){
handler.postDelayed(this, 1000);
}else{
swipeLayout.setRefreshing(false);
mainActivity.forceUpdate();
setLayout();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
};
private boolean isRefreshing(){
return swipeLayout.isRefreshing();
}
答案 0 :(得分:22)
嗯,当然,它不会停下来刷新,看看你的循环。
if(isRefreshing()){
handler.postDelayed(this, 1000);
}else{
swipeLayout.setRefreshing(false);
mainActivity.forceUpdate();
setLayout();
}
基本上你永远不会阻止它, " swipeLayout.setRefreshing(false);" 永远不会被调用,因为它需要的条件是(isRefreshing())是假的,所以它没有任何意义,你总是从" isRefreshing()"得到一个真正的值。因为你永远不会告诉它停止。 基于isRefreshing的布尔值setRefreshing为false在我看来是错误的,你不应该依赖它,你应该决定何时停止刷新状态。
通常PullToRefresh用于从服务器获取新数据。 所以基本上我建议在你从服务器得到答案的地方插入这张支票:
if (swipeLayout.isRefreshing()) {
swipeLayout.setRefreshing(false);
}
因为一旦您从服务器获取新数据,就需要停止刷新。
编辑 - 添加了完整的代码示例
protected SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
retrieveDocuments();
}
};
public void retrieveDocuments() {
//some code, server call
//onCompletion is your server response with a success
@Override
public void onCompletion(String result) {
if (mSwipeRefreshLayout.isRefreshing()) {
mSwipeRefreshLayout.setRefreshing(false);
}
}
}
答案 1 :(得分:9)
这将删除动画:
mSwipeRefreshLayout.setRefreshing(false);
答案 2 :(得分:3)
就我而言,我做了
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
}
});
两次。 然后,它不会被
删除mSwipeRefreshLayout.setRefreshing(false);
答案 3 :(得分:3)
如果你想在加载页面时停止加载动画,那么你必须先找到页面在Webview中完全加载的时候。
以下是在Webview中加载页面的完整代码,然后在完成页面加载后停止加载动画。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
final WebView wvSocialMediaPage = findViewById(R.id.wv_social_media_page);
wvSocialMediaPage.setWebViewClient(new CustomWebViewClient());
WebSettings webSetting = wvSocialMediaPage.getSettings();
webSetting.setJavaScriptEnabled(true);
webSetting.setDisplayZoomControls(true);
wvSocialMediaPage.loadUrl("https://facebook.com");
swipeRefreshLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe_container);
swipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
wvSocialMediaPage.reload();
}
}
);
}
private class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
swipeRefreshLayout.setRefreshing(false);
}
}
onPageFinished将在页面加载成功后找到然后停止动画。
答案 4 :(得分:2)
在UI线程中使用setRefreshing(false)
。
试试这个:
Handler mHandler = new Handler();//In UI Thread
...
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
swipeLayout.setRefreshing(isRefreshing);
}
}, delayTime);
答案 5 :(得分:0)
确保已设置您的听众。
mSwipeRefreshLayout = findViewById(R.id.swiperefresh);
mSwipeRefreshLayout.setOnRefreshListener(this); // Important
答案 6 :(得分:0)
不喜欢听众。我确实认为如果您使用C#进行编码-您必须遵循其范例。其中之一就是事件。 MvxSwipeRefreshLayout具有称为刷新的事件。 而且您可以在其处理程序中执行的操作是花一些时间,例如等待,然后将Refreshing设置为false
private async void SwipeToRefreshControl_Refresh(object sender, EventArgs e)
{
await ...some stuff here...
(sender as MvxSwipeRefreshLayout).Refreshing = false;
}
答案 7 :(得分:0)
如果您使用Kotlin,则可以与协程一起使用。
binding.dashboardRefresh
是我的SwipeRefreshLayout。
//Refresh the info on Swipe-Refresh
binding.dashboardRefresh.run {
setOnRefreshListener {
menuViewModel.getFields()
val workerScope = CoroutineScope(Dispatchers.IO)
workerScope.launch {
delay(3000)
isRefreshing = false
}
}
}