0
点赞
收藏
分享

微信扫一扫

Android GridView/ListView与SwipeRefreshLayout 常见的冲突解决并不完美


一个小bug,关于下拉冲突问题,分两步:

1.判断GridView/ListView滑动到顶部再激活下拉,

2.离开顶部关闭下拉;

但是 这边第一种方案有一个问题:

 当GridView中第一个item出现在屏幕上端,即使只出现一部分,也会认为到达了顶部,

从而造成没到顶部就激活了下拉, 成为一个失败的方案.

失败方案举例:

mGridView.setOnScrollListener(new AbsListView.OnScrollListener() {  
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}


@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if (firstVisibleItem == 0) {
mSwipeRefreshLayout.setEnabled(true);
Log.d("ListView", "滚动到顶部");
} else {
mSwipeRefreshLayout.setEnabled(false);
}
if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
Log.d("ListView", "滚动到底部");
}
}
});

成功方案举例:

原理: 判断item出现, 同时判断第一个item距离头部的距离

mGridView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {


}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (view.getCheckedItemPosition() == 0) {

} else {
swlayout.setEnabled(false);
}
if (firstVisibleItem == 0) {
View firstVisibleItemView = mGridView.getChildAt(0);
if (firstVisibleItemView != null && firstVisibleItemView.getTop() == 0) {
swlayout.setEnabled(true);
} else {
swlayout.setEnabled(false);
}
} else {
swlayout.setEnabled(false);
}

// 判断滚动到底部
if (view.getLastVisiblePosition() == (view.getCount() - 1)) {

}
}
});

经检验,问题已成功解决.

举报

相关推荐

0 条评论