У меня была похожая проблема. Проблема заключается в том, что ListView перехватывает сенсорные события из вашей галереи и изменяет позицию представления в своем блоке кода, который имеет дело с вертикальной прокруткой ListView. Если бы только Галерея перехватила событие касания первым ... Я считаю, что это ошибка в исходном коде 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);
}
}
Кроме того, установите что-то подобное в упражнении, которое реализует галерею:
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);
}
Последнее замечание ... После полной реализации я обнаружил, что с точки зрения удобства использования было бы лучше расширить ViewAnimator с помощью пользовательского класса, который я назвал AdaptableViewAnimator, который, конечно, просто имел некоторые встроенные функции адаптера, и вставил ListView внутри него. Он не плавает так сильно, как ListView-inside-Gallery.