Question

L'objectif est de mettre en œuvre une galerie dont le rendement adaptateur listviews (en d'autres termes, le défilement vertical listviews intégrés dans une galerie défilement horizontal). Ce genre de travaux après un peu de travail, mais en essayant de faire défiler horizontalement, le ListView semble très nerveux, comme il y a une adhésivité à étant centrée. Je ne l'ai pas observé ce genre de comportement avec tout autre type de vue intégrée dans une galerie.

Voici ce que j'ai essayé:

Dans un premier temps, je trouve que les événements tactiles écrasa ListView, de sorte que l'auditeur du geste de la Galerie ne se tiré.

Ainsi, dans la méthode onCreate () de l'activité, je créé un GestureDetector:

galleryGestureDetector = new GestureDetector(this, gallery);

Ensuite, à l'intérieur de la méthode getView () de l'adaptateur Gallery, après la ListView a été gonflé et configuré, j'ai un code comme ceci:

listView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        galleryGestureDetector.onTouchEvent(event);
        return true;
    }
});

Dans ce cas, je suis même allé à l'étape de l'extrême de retour vrai du OnTouchListener pour faire en sorte que la méthode onTouchEvent () du listView est jamais réellement appelé. Le même comportement se produit nerveux. En conséquence, je pense que je peux exclure la concurrence mises en œuvre onTouchEvent () entre les deux vues.

J'ai essayé d'abuser du concept de TouchDelegate et en étendant le rectangle tactile de la Galerie d'inclure le ListView, puis forcer le ListView à déléguer, mais ce fut un effort futile aussi.

Je vomissait mes mains et dire qu'il est pas possible actuellement, mais l'application de réseautage social que les paquets avec le DroidX accomplit en quelque sorte le!

Était-ce utile?

La solution

Le problème est que ListView intercepte les événements tactiles de la galerie, puis modifier la position de vue elle-même. C'est ce qui conduit à l'arrière et en avant l'effet de sautillement que je vois quand j'utiliser les widgets comme il est. Je considère cela comme un bug dans la galerie de widgets, mais en attendant, il peut être fixé par le sous-classement Galerie présente comme suit:

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);
}

}

Si vous utilisez BetterGallery en place de la galerie, le tout fonctionne très bien!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top