您可以创建自定义
ScrollView
和
ListView
和覆盖
onInterceptTouchEvent(MotionEvent event)
这样地:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
View view = (View) getChildAt(getChildCount()-1);
int diff = (view.getBottom()-(getHeight()+getScrollY()));
if( event.getAction() == MotionEvent.ACTION_DOWN) {
if (diff ==0) {
return false;
}
}
return super.onInterceptTouchEvent(event);
}
这样每次向下触摸
列表视图
当你在
卷轴视图
将前往
列表视图
.
这只是一个草图实现,但我认为您可以通过执行相同的操作来检测何时处于
列表视图
需要注意的是,我只需要使用
列表视图
以您当前的内容
卷轴视图
通过使用添加为ListView的标头
listView.addHeaderView(scrollViewContent)
我不知道这是否符合你的需要。
编辑:
检测何时开始滚动
卷轴视图
.保留以下内容的参考
列表视图
在
卷轴视图
。当用户向上滚动时
列表视图
位于顶部,让事件由
卷轴视图
.
private void init(){
ViewConfiguration vc = ViewConfiguration.get(getContext());
mTouchSlop = vc.getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
final int action = MotionEventCompat.getActionMasked(event);
switch (action) {
case MotionEvent.ACTION_DOWN:{
yPrec = event.getY();
}
case MotionEvent.ACTION_MOVE: {
final float dy = event.getY() - yPrec;
if (dy > mTouchSlop) {
// Start scrolling!
mIsScrolling = true;
}
break;
}
}
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
mIsScrolling = false;
}
// Calculate the scrolldiff
View view = (View) getChildAt(getChildCount()-1);
int diff = (view.getBottom()-(getHeight()+getScrollY()));
if ((!mIsScrolling || !listViewReference.listIsAtTop()) && diff == 0) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
return false;
}
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
mIsScrolling = false;
}
return super.onTouchEvent(ev);
}
public void setListViewReference(MyListView listViewReference) {
this.listViewReference = listViewReference;
}
ListView中的listIsAtTop方法如下所示:
public boolean listIsAtTop() {
if(getChildCount() == 0) return true;
return (getChildAt(0).getTop() == 0 && getFirstVisiblePosition() ==0);
}