以编程方式触发SwipeRefreshLayout

Nik*_*las 59 java android swiperefreshlayout

有没有办法以SwipeRefreshLayout编程方式触发?应该启动动画,并且应该调用界面中的onRefresh方法OnRefreshListener.

Ram*_*amz 132

如果您使用的是5.0中的新swipeRefreshLayout 在此输入图像描述

如上图所示,您只需添加以下行以编程方式触发滑动刷新布局

 mSwipeRefreshLayout.post(new Runnable() {
        @Override
        public void run() {
            mSwipeRefreshLayout.setRefreshing(true);
        }
    });
Run Code Online (Sandbox Code Playgroud)

如果你只是打电话

 mSwipeRefreshLayout.setRefreshing(true);
Run Code Online (Sandbox Code Playgroud)

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

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

为了停止循环加载动画调用 mSwipeRefreshLayout.setRefreshing(false)

  • @Ramz我试过你的片段 - 微调器显示但不像你提到的那样,当我手动调用setRefreshing(true)时,我的片段实现的onRefresh回调没有被调用(Motorola Moto X 2014 Android 5+).所以我必须将微调器设置为刷新并手动调用onRefresh回调来执行我的刷新代码. (15认同)
  • 在mSwipeRefreshLayout.setRefreshing(true)之后,OnRefreshListener将不会执行...你应该修复它 (12认同)
  • 我认为这是SwipeRefreshLayout中的一个错误,该类中有一个名为setRefreshing(boolean refresh,boolean notify)的私有方法,它允许您控制是否"通知"您的侦听器,但setRefreshing(布尔刷新)将"false"传递给此私有方法,这就是为什么我们的监听器永远不会被调用. (2认同)

Min*_*in2 25

为了触发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();
        }
    };
Run Code Online (Sandbox Code Playgroud)

现在关键部分:

swipeLayout.post(new Runnable() {
@Override public void run() {
     swipeLayout.setRefreshing(true);
     // directly call onRefresh() method 
     swipeRefreshListner.onRefresh();
   }
});
Run Code Online (Sandbox Code Playgroud)