问题
我们滚动的布局控件 ScrollView 或NestScrollView 加一个SwipeRefreshLayout下拉刷新,会出现这样一种情况:
先将ScrollView 向上滑动一部分,然后松手,然后再向下滑动,.此时会出现先触发swipeRefreshLayout的问题。
影响客户体验。
解决
当ScrollView到顶部以后才触发刷新事件。
1 如果 SwipeRefreshLayout 直接嵌套一个 ScrollView 或NestScrollView ,判断ScrollView 是否滑动到顶端。进而动态设置 SwipeRefreshLayout 是否可用 即可解决。
scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
// 这只一定是 == ,不能是 <= ,scrollView 会自己调整
swipeRefreshLayout.setEnabled(scrollView.getScrollY()==0);
}
});
2 如果 SwipeRefreshLayout 嵌套一个 CoordinatorLayout 布局,CoordinatorLayout 布局里面有ScrollView ,用上面的方法 就不行了,是否在顶端就不准确了,
好在 可以 监听 AppBarLayout Offset 的变化,动态设置 SwipeRefreshLayout 是否可用。
appBarLayout = (AppBarLayout) findViewById(R.id.appbar_layout);
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (verticalOffset >= 0) {
mSwipeRefreshLayout.setEnabled(true);
} else {
mSwipeRefreshLayout.setEnabled(false);
}
}
});