67

有没有办法以SwipeRefreshLayout编程方式触发?动画应该开始并且接口中的onRefresh方法OnRefreshListener应该被调用。

4

7 回答 7

143

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

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

工作

在 Java 中:

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

在 Kotlin 中:

mSwipeRefreshLayout.post { mSwipeRefreshLayout.isRefreshing = true }

不行

如果你只是用 Java 调用:

 mSwipeRefreshLayout.setRefreshing(true);

或在科特林

 mSwipeRefreshLayout.isRefreshing = true

它不会触发圆形动画,因此通过添加上面的行,您只需在 UI 线程中进行延迟,以便它在 ui 线程内显示圆形动画。

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

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

于 2015-01-17T17:41:40.660 回答
27

为了触发 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();
   }
});
于 2016-02-25T07:50:58.627 回答
1

有点晚了,但您不需要启动 Runnable 来执行此操作。您可以简单地触发刷新并直接在 onCreate 中调用您的 onRefresh 方法,或者在您希望发生这种情况的任何地方:

class MyFragment: SwipeRefreshLayout.OnRefreshListener {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initViews()
    }

    fun initViews() {
        swipe_refresh_layout?.apply {
            setOnRefreshListener(this@MyFragment)
            isRefreshing = true
            onRefresh()
        }
    }

    override fun onRefresh() {
        // Do my refresh logic here
    }
}
于 2020-01-08T12:55:11.037 回答
1

只需创建一个并在需要时SwipeRefreshLayout.OnRefreshListener调用它的函数:onRefresh()

SwipeRefreshLayout srl;
SwipeRefreshLayout.OnRefreshListener refreshListener;

srl = (SwipeRefreshLayout)v.findViewById(R.id.swipeRefreshLayout);

refreshListener = new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
      //Do your stuff here
    }
};
srl.setOnRefreshListener(refreshListener);

现在,每当您想手动调用它时,只需通过侦听器调用它

refreshListener.onRefresh();
于 2020-06-15T17:10:04.040 回答
0
binding.swipeRefreshLayout.setRefreshing(true); // show loading 
binding.swipeRefreshLayout.post(this::updateUI); // call method
binding.swipeRefreshLayout.setOnRefreshListener(this::updateUI); // call method
于 2019-05-30T09:50:19.137 回答
-1

您可以以编程方式调用 onRefresh() 方法,然后在方法内部启动动画(如果尚未启动)。请参阅以下内容:

@Override
public void onRefresh() {
    if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true);
    //TODO
}
于 2016-10-12T20:20:23.973 回答
-2

只是为了强制将这两个添加到可启用的滑动手势中

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();
        }
    }
);
于 2016-09-07T09:24:13.387 回答