上一篇我们已经基本实现了下拉刷新的效果,本篇介绍,嵌套ListView,RecyclerView以及ScrollView时的滑动冲突解决方式。
嵌套ListView
我们先看看嵌套了ListView的效果:
在嵌套ListView时,我们的父布局要在什么时候拦截呢?
当ListView滑到顶部时,父布局才能下拉。
当ListView滑到底部时,父布局才能上拉。
那如何判断ListView到达顶部以及底部呢?
第一个可见Item的位置为 0 即 firstVisibleItem=0,并且 firstVisibleitemView.getTop() == 0,ListView的第一个Item的高度为0
if (firstVisibleItem == 0) {
View firstVisibleitemView = listView.getChildAt(0);
if (firstVisibleitemView != null && firstVisibleitemView.getTop() == 0) {
Log.d(TAG, "onScroll: 滑动到顶部 ");
}
同理,我们判断到达底部的代码为
if ((firstVisibleItem + visibleItemCount) == totalItemCount) { //第一个可见Item的位置和总的可见数相加
View lastVisibleItemView = listView.getChildAt(listView.getChildCount() - 1);
if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == listView.getHeight()) {
Log.d(TAG, "onScroll: 滑动到底部 ->"+lastVisibleItemView.getBottom());
}
}
代码
listView.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) {
View firstVisibleitemView = listView.getChildAt(0);
if (firstVisibleitemView != null && firstVisibleitemView.getTop() == 0) {
Log.d(TAG, "onScroll: 滑动到顶部 ");
}
} else if ((firstVisibleItem + visibleItemCount) == totalItemCount) { //第一个可见Item的位置和总的可见数相加
View lastVisibleItemView = listView.getChildAt(listView.getChildCount() - 1);
if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == listView.getHeight()) {
Log.d(TAG, "onScroll: 滑动到底部 ->"+lastVisibleItemView.getBottom());
}
}
}
});
上面的代码是我们在Activity中的使用方法。我们把这个思路换到我们的自定义View中,如下,当滑动到ListView的顶部和底部时,我们在ACTION_MOVE进行拦截。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercept = false;
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastMoveY = y;