2014-07-05 75 views
49

有没有什么办法以编程方式触发SwipeRefreshLayout?应该启动动画,并调用OnRefreshListener接口中的onRefresh方法。以编程方式SwipeRefreshLayout触发器

+5

那么,这似乎是不可能的。在我的情况下,我必须调用'mSwipeRefreshLayout.setRefreshing(true);'并且新建一个AsyncTask的实例,然后手动执行它。当然,我把它们放在一个名为'doRefresh()'和'onRefresh()'的方法中,它调用'doRefresh()' –

+0

[如何在Android中触发swiperefreshlayout?](http://stackoverflow.com/questions/26513315/how-to-trigger-swiperefreshlayout-in-android) – opticod

+0

@opticod一个问题是如何被问及早于'可能'复制重复? – Niklas

回答

110

,如果您使用的是5.0 enter image description here

intoduced新swipeRefreshLayout如图像上面,你只需要添加以下行来触发刷卡刷新布局编程

mSwipeRefreshLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      mSwipeRefreshLayout.setRefreshing(true); 
     } 
    }); 

,如果你简单地调用

mSwipeRefreshLayout.setRefreshing(true); 

它不会触发圆圈动画,所以通过添加上面的行你只是延迟UI d以便它显示ui线程内的圆形动画。

通过调用mSwipeRefreshLayout.setRefreshing(true)OnRefreshListener得不到执行

为了阻止圆形加载动画调用mSwipeRefreshLayout.setRefreshing(false)

+0

我喜欢在文档中没有提到这个吗?我一直有无尽的负载迹象不显示。是否可以从UI线程调用'.setRefreshing(false)'? – Zapnologica

+0

@Zapnologica:是的,你可以。我从我的AsyncTask的onPostExecute调用它,它是在onRefresh()中触发的。 – AgentKnopf

+15

@Ramz我尝试了你的代码片段 - 微调器显示,但不像你提到的,当我像你一样手动调用setRefreshing(true)时,我的片段实现的onRefresh回调没有被调用(Motorola Moto X 2014 Android 5+)。所以我必须设置微调刷新并手动调用onRefresh回调来执行我的刷新代码。 – AgentKnopf

16

为了触发SwipeRefreshLayout我试过这个解决方案:

SwipeRefreshLayout.OnRefreshListener swipeRefreshListner = new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      Log.i(TAG, "onRefresh called from SwipeRefreshLayout"); 
      // This method performs the actual data-refresh operation. 
      // The method calls setRefreshing(false) when it's finished. 
      loadData(); 
     } 
    }; 

现在关键部分:

swipeLayout.post(new Runnable() { 
@Override public void run() { 
    swipeLayout.setRefreshing(true); 
    // directly call onRefresh() method 
    swipeRefreshListner.onRefresh(); 
    } 
}); 
+1

正如hac.jack之前回答的评论中提到的那样,SwipeRefreshLayout似乎存在一个错误。有一个由setRefreshing(布尔刷新)调用的内部方法setRefreshing(boolean refreshing,boolean notify)。 notify参数默认设置为false,因此OnRefreshListener从不更新。这个答案对于更新侦听器是正确的。 – Zac

+0

swipeRefreshLayout.setOnRefreshListener( 新SwipeRefreshLayout.OnRefreshListener(){ @Override 公共无效onRefresh(){ Log.i(TAG, “onRefresh从SwipeRefreshLayout称为”); //该方法执行实际的数据刷新 } );该方法在完成时调用setRefreshing(false)。 – Goodlife

0

只是为了迫使在添加此两ennable滑动手势

swipeRefreshLayout.setOnRefreshListener(
    new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      Log.i(TAG, "onRefresh called from SwipeRefreshLayout"); 

      // This method performs the actual data-refresh operation. 
      // The method calls setRefreshing(false) when it's finished. 
      FetchData(); 
     } 
    } 
); 
0

你可以叫onRefresh()方法以编程,然后在方法内部启动动画,如果它尚未启动。看到以下内容:

@Override 
public void onRefresh() { 
    if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true); 
    //TODO 
} 
相关问题