SwipeRefreshLayout 拉取多次行为(SDK 23)
SwipeRefreshLayout pull multiple times behaviour (SDK 23)
我有 SwipeRefreshLayout
是这样的:
.xml:
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<android.support.v7.widget.RecyclerView
android:id="@+id/haberRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
.java:
private SwipeRefreshLayout swipeLayout;
swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout);
swipeLayout.setColorSchemeColors(getResources().getColor(R.color.primary_color));
swipeLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
refreshContent();
}
});
这让我可以拉 swipeRefresh
多次 并且循环动画变得很奇怪,有时它会停留在屏幕上而不循环:
在第一次拉动时它看起来有点在上面,在第二次拉动时它下降了一点,就像图片上一样。
如何在已经刷新的情况下禁用 多次拉动 SwipeRefresh
?
我想这不会发生在 sdk 23 以下。我正在使用 buildTool 23、targetSdk 23、support-v4:23、appcompat-v7:23。
更新: 如果我使用 ListView
而不是 RecyclerView
,则不会发生这种情况。
添加布尔变量来检查您的列表是否正在刷新。
if (!refreshing)
refreshContent();
您可以子类化 SwipeRefreshLayout
,提供 canChildScrollUp()
的自定义实现
@Override
public boolean canChildScrollUp() {
if (isRefreshing()) {
return true;
}
return false;
}
当然你应该检查你的回收站视图是否已经显示了它的第一个 child 和 return 相应的值
您需要在完成数据更新后调用 mSwipeRefreshLayout.stopRefreshing()。
public void refreshContent() {
...
//end of your "refresh" code
if(mSwipeRefreshLayout.isRefreshing())
mSwipeRefreshLayout.stopRefreshing()
}
这看起来像是 23.0.0 版本中引入的 appcompat-v7 支持库中的错误。
作为解决方法,您可以在 OnRefreshListener#onRefresh 回调中禁用 SwipeRefreshLayout,并在加载数据时再次启用它:
private class MyOnRefreshListener implements SwipeRefreshLayout.OnRefreshListener {
@Override
public void onRefresh() {
swipeRefreshLayout.setEnabled(false);
load();
}
private void onLoaded() {
swipeRefreshLayout.setEnabled(true);
swipeRefreshLayout.setRefreshing(false);
}
}
这个问题是在 support-v4 23.0.0 中引入的,是由于新的嵌套滚动功能没有检查是否 isRefreshing()。
您应该扩展 SwipeRefreshLayout 并覆盖 onStartNestedScroll 函数:
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
return !isRefreshing() && super.onStartNestedScroll(child, target, nestedScrollAxes);
}
"support-v4:23.1.0" 已经修复了这个错误。
我有 SwipeRefreshLayout
是这样的:
.xml:
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<android.support.v7.widget.RecyclerView
android:id="@+id/haberRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout>
.java:
private SwipeRefreshLayout swipeLayout;
swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_refresh_layout);
swipeLayout.setColorSchemeColors(getResources().getColor(R.color.primary_color));
swipeLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
refreshContent();
}
});
这让我可以拉 swipeRefresh
多次 并且循环动画变得很奇怪,有时它会停留在屏幕上而不循环:
在第一次拉动时它看起来有点在上面,在第二次拉动时它下降了一点,就像图片上一样。
如何在已经刷新的情况下禁用 多次拉动 SwipeRefresh
?
我想这不会发生在 sdk 23 以下。我正在使用 buildTool 23、targetSdk 23、support-v4:23、appcompat-v7:23。
更新: 如果我使用 ListView
而不是 RecyclerView
,则不会发生这种情况。
添加布尔变量来检查您的列表是否正在刷新。
if (!refreshing)
refreshContent();
您可以子类化 SwipeRefreshLayout
,提供 canChildScrollUp()
@Override
public boolean canChildScrollUp() {
if (isRefreshing()) {
return true;
}
return false;
}
当然你应该检查你的回收站视图是否已经显示了它的第一个 child 和 return 相应的值
您需要在完成数据更新后调用 mSwipeRefreshLayout.stopRefreshing()。
public void refreshContent() {
...
//end of your "refresh" code
if(mSwipeRefreshLayout.isRefreshing())
mSwipeRefreshLayout.stopRefreshing()
}
这看起来像是 23.0.0 版本中引入的 appcompat-v7 支持库中的错误。 作为解决方法,您可以在 OnRefreshListener#onRefresh 回调中禁用 SwipeRefreshLayout,并在加载数据时再次启用它:
private class MyOnRefreshListener implements SwipeRefreshLayout.OnRefreshListener {
@Override
public void onRefresh() {
swipeRefreshLayout.setEnabled(false);
load();
}
private void onLoaded() {
swipeRefreshLayout.setEnabled(true);
swipeRefreshLayout.setRefreshing(false);
}
}
这个问题是在 support-v4 23.0.0 中引入的,是由于新的嵌套滚动功能没有检查是否 isRefreshing()。
您应该扩展 SwipeRefreshLayout 并覆盖 onStartNestedScroll 函数:
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
return !isRefreshing() && super.onStartNestedScroll(child, target, nestedScrollAxes);
}
"support-v4:23.1.0" 已经修复了这个错误。