有没有办法以SwipeRefreshLayout
编程方式触发?动画应该开始并且接口中的onRefresh
方法OnRefreshListener
应该被调用。
7 回答
如果您使用的是 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)
为了触发 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();
}
});
有点晚了,但您不需要启动 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
}
}
只需创建一个并在需要时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();
binding.swipeRefreshLayout.setRefreshing(true); // show loading
binding.swipeRefreshLayout.post(this::updateUI); // call method
binding.swipeRefreshLayout.setOnRefreshListener(this::updateUI); // call method
您可以以编程方式调用 onRefresh() 方法,然后在方法内部启动动画(如果尚未启动)。请参阅以下内容:
@Override
public void onRefresh() {
if (!mSwipeRefreshLayout.isRefreshing()) mSwipeRefreshLayout.setRefreshing(true);
//TODO
}
只是为了强制将这两个添加到可启用的滑动手势中
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();
}
}
);