上一篇我们已经基本实现了下拉刷新的效果,本篇介绍,嵌套ListView,RecyclerView以及ScrollView时的滑动冲突解决方式。
嵌套ListView
我们先看看嵌套了ListView的效果:
在嵌套ListView时,我们的父布局要在什么时候拦截呢?
当ListView滑到顶部时,父布局才能下拉。
当ListView滑到底部时,父布局才能上拉。
那如何判断ListView到达顶部以及底部呢?
第一个可见Item的位置为 0 即 firstVisibleItem=0,并且 firstVisibleitemView.getTop() == 0,ListView的第一个Item的高度为0
1 | if (firstVisibleItem == 0) { |
同理,我们判断到达底部的代码为
1 | if ((firstVisibleItem + visibleItemCount) == totalItemCount) { //第一个可见Item的位置和总的可见数相加 |
代码
1 | listView.setOnScrollListener(new AbsListView.OnScrollListener() { |
上面的代码是我们在Activity中的使用方法。我们把这个思路换到我们的自定义View中,如下,当滑动到ListView的顶部和底部时,我们在ACTION_MOVE进行拦截。
1 | @Override |
嵌套RecyclerView
1 | //下拉 |
利用了View的一个方法。public boolean canScrollVertically (int direction)
这个方法是判断View在竖直方向是否还能 向上,向下 滑动。
根据上面的例子,应该可以看出。 -1 表示 向上, 1 表示向下。
当RecycleView不能再向上滑时,表示已经到达顶部,
当RecycleView不能再向下滑时,表示已经到达底部。
嵌套ScrollView
判断顶部
当我们的ScrollView.getScrollerY < = 0的时候就能判定ScrollView到达了顶部。
1 | if (child instanceof ScrollView) { |
判断底部
当我们的ScrollView.getScrollerY+getHeight > = ScrollView.getChildAt(0).getHeight ,即大于总的ScrollView的长度时,判定ScrollView到达底部。
1 | if (child instanceof ScrollView) { |
全部代码,主要变更的是onInterceptTouchEvent
1 | public class SimpleRefreshLayout extends ViewGroup { |
下一篇我们将对上述代码进行优化,更改上拉和下拉的动态效果。并参考SwipeRefreshLayout对组件进行修改。