这个问题呢,在我初次接触SwipeRefreshLayout的时候也遇到过,后来查了相关资料和网络信息,得以解决,今天再次想到了这个问题,就记下来做个备忘吧。
首先说一下使用方式:SwipeRefreshLayout作为官方下拉刷新控件,要将 ListView控件包裹在里面,这样才能在滑动ListView的时候监听到滑动事件进而从顶部调出下拉刷新控件
.support.v4.widget.SwipeRefreshLayout
android:id="@+id/ly_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
"@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
.support.v4.widget.SwipeRefreshLayout>
然而就是因为这样,才出现了滑动冲突问题,因为一旦启用SwipeRefreshLayout,只要是包裹之内的容器发生下拉动作,就会触发刷新,那样,ListView内容如果大于一屏,滚动到下面就无法回到顶部了,因为滚回顶部需要下拉滑动,就会首先触发SwipeRefreshLayout的下拉事件,尴不尴尬,扎不扎心?
没事,很好解决,直接看代码吧
lv.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
boolean enable = false;
if (lv != null && lv.getChildCount() > 0) {
boolean firstItemVisible = lv.getFirstVisiblePosition() == 0;
boolean topOfFirstItemVisible = lv.getChildAt(0).getTop() == 0;
enable = firstItemVisible && topOfFirstItemVisible;
}
lyRefresh.setEnabled(enable);
}
});
原理很简单,监听ListView的OnScrollListener事件,如果item没有滑到最顶端,就禁用SwipeRefreshLayout,到了顶端以后再启用,就不会产生冲突了