Je rencontre un problème similaire. Le problème est que le ListView intercepte les événements tactiles de votre Gallery et modifie la position de la vue dans son bloc de code qui traite du défilement vertical du ListView. Si seulement Gallery interceptait d'abord l'événement tactile... Je considère cela comme un bogue dans la source Android, mais en attendant, vous pouvez corriger le défilement non fluide en sous-classant Gallery et en utilisant votre sous-classe à la place. Cela fonctionnera :
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);
}
}
De plus, définissez quelque chose comme ceci dans l'activité qui implémente la galerie :
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;
}
});
Enfin, ajoutez onTouchEvent() à l'activité elle-même :
@Override
public boolean onTouchEvent(MotionEvent event) {
return galleryView.onTouchEvent(event);
}
Une dernière chose... Après avoir mis en œuvre cela complètement, j'ai trouvé qu'en termes d'utilisabilité, il était préférable d'étendre ViewAnimator avec une classe personnalisée que j'ai appelée AdaptableViewAnimator, qui avait bien sûr quelques fonctionnalités d'adaptateur intégrées, et d'incorporer le ListView à l'intérieur. Il ne flotte pas autant que le ListView à l'intérieur de Gallery.