当SwipeRefreshLayout只有ListView一个子view的时候是没有任何问题的,但如果不是一个子view就会出现问题了,向上滑动
ListView一切正常,向下滑动的时候就会出现还没有滑倒ListView顶部就触发下拉刷新的动作了。
首先,我们只需写一个类继承SwipeRefreshLayout,然后重写canChildScrollUp方法:
public
class
SimpleSwipeRefreshLayout
extends
SwipeRefreshLayout {
private
View view;
public
SimpleSwipeRefreshLayout(Context context) {
super
(context);
}
public
SimpleSwipeRefreshLayout(Context context, AttributeSet attrs) {
super
(context, attrs);
}
public
void
setViewGroup(View view) {
this
.view = view;
}
@Override
public
boolean
canChildScrollUp() {
if
(view !=
null
&& view
instanceof
AbsListView) {
final
AbsListView absListView = (AbsListView) view;
return
absListView.getChildCount() >
0
&& (absListView.getFirstVisiblePosition() >
0
|| absListView.getChildAt(
0
)
.getTop() < absListView.getPaddingTop());
}
return
super
.canChildScrollUp();
}
}
如果实现上述方法,仍然无法解决上述问题,可继续添加以下代码:
listView.setOnScrollListener(
new
OnScrollListener() {
@Override
public
void
onScrollStateChanged(AbsListView view,
int
scrollState) {
}
@Override
public
void
onScroll(AbsListView view,
int
firstVisibleItem,
int
visibleItemCount,
int
totalItemCount) {
boolean
enable =
false
;
if
(listView !=
null
&& listView.getChildCount() >
0
){
// 检查listView第一个item是否可见
boolean
firstItemVisible = listView.getFirstVisiblePosition() ==
0
;
// 检查第一个item的顶部是否可见
boolean
topOfFirstItemVisible = listView.getChildAt(
0
).getTop() ==
0
;
// 启用或者禁用SwipeRefreshLayout刷新标识
enable = firstItemVisible && topOfFirstItemVisible;
}
else
if
(listView !=
null
&& listView.getChildCount() ==
0
) {
// 没有数据的时候允许刷新
enable =
true
;
}
// 把标识传给swipeRefreshLayout
swipeRefreshLayout.setEnabled(enable);
}});