Frage

Ziel ist es, eine Galerie zu implementieren, deren Adapter ListViews zurückgibt (mit anderen Worten, die in einer horizontal Scrolling -Galerie eingebettete skrollende Listenansichten vertikal scrollen). Es funktioniert nach ein wenig Arbeit, aber wenn man versucht, horizontal zu scrollen, sieht die ListView sehr nervös aus, als ob es eine gewisse Klebrigkeit gibt, die zentriert wird. Ich habe diese Art von Verhalten nicht mit einer anderen Art der Sichtweise beobachtet, die in eine Galerie eingebettet ist.

Hier ist, was ich versucht habe:

Zunächst stellte ich fest, dass die ListView -Touch -Ereignisse gequetscht wurden, sodass der Gestenhörer in der Galerie nie gefeuert wird.

In der OnCreate () -Methode der Aktivität habe ich also einen gestiketen Totektor erstellt:

galleryGestureDetector = new GestureDetector(this, gallery);

In der GetView () -Methode des Galerieadapters, nachdem die ListView aufgeblasen und konfiguriert wurde, habe ich einen solchen Code wie diesen:

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

In diesem Fall habe ich sogar den extremen Schritt aus dem OnTouchListener zurückgekehrt, um sicherzustellen, dass die Methode von OnTouchEvent () der ListView nie tatsächlich aufgerufen wird. Das gleiche nervöse Verhalten tritt auf. Ich denke, ich kann konkurrierende Implementierungen zwischen den beiden Ansichten ausschließen.

Ich habe versucht, das Touchdelegate -Konzept auch zu missbrauchen, indem ich das Touch -Rechteck der Galerie auf die ListView erweiterte und dann die ListView dazu zwang, ihn zu delegieren, aber dies war auch eine vergebliche Anstrengung.

Ich würde meine Hände hochwerfen und sagen, dass es derzeit nicht möglich ist, aber die Social -Networking -App, die mit dem Droidx einpackt, erreicht sie irgendwie!

War es hilfreich?

Lösung

Das Problem ist, dass ListView Berührungsereignisse aus der Galerie abfasst und dann die Ansichtsposition selbst verändert. Dies führt zu dem Hin- und Her -Jittering -Effekt, den ich sehe, wenn ich die Widgets so verwende. Ich betrachte dies für einen Fehler im Galerie -Widget, aber in der Zwischenzeit kann es durch die Unterklasse Galerie wie folgt behoben werden:

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

}

Wenn Sie Bettergallery anstelle der Galerie verwenden, funktioniert das Ganze gut!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top