我遇到了类似的问题。问题是 ListView 正在拦截来自您的 Gallery 的触摸事件,并在其处理 ListView 垂直滚动的代码块中修改视图位置。如果只有 Gallery 首先拦截了触摸事件...我认为这是 Android 源代码中的一个错误,但与此同时,您可以通过子类化 Gallery 并改用您的子类来修复不平滑的滚动。这样就可以了:
public class BetterGallery extends Gallery {
private boolean scrollingHorizontally = false;
public BetterGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public BetterGallery(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BetterGallery(Context context) {
super(context);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
super.onInterceptTouchEvent(ev);
return scrollingHorizontally;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
scrollingHorizontally = true;
return super.onScroll(e1, e2, distanceX, distanceY);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
scrollingHorizontally = false;
}
return super.onTouchEvent(event);
}
}
另外,在实现画廊的 Activity 中设置如下内容:
ListView listView = (ListView) view.findViewById(R.id.users);
listView.setAdapter(userListAdapter);
listView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
galleryView.onTouchEvent(event);
return false;
}
});
最后,将 onTouchEvent() 添加到活动本身:
@Override
public boolean onTouchEvent(MotionEvent event) {
return galleryView.onTouchEvent(event);
}
最后一点...在完全实现之后,我发现从可用性的角度来看,最好使用我称为 AdaptableViewAnimator 的自定义类扩展 ViewAnimator,当然它只是嵌入了一些适配器功能,并嵌入里面的ListView。它不像 ListView-inside-Gallery 那样浮动。