Domanda

L'obiettivo è quello di implementare una galleria il cui rendimento adattatore ListViews (in altre parole, lo scorrimento in verticale ListViews incorporati in una galleria di scorrimento orizzontale). E 'sorta di lavori, dopo un po' di lavoro, ma quando si tenta di scorrere orizzontalmente, il ListView sembra molto nervosa, come v'è una certa vischiosità ad esso essere centrato. Non ho osservato questo tipo di comportamento con qualsiasi altro tipo di vista incorporata in una galleria.

Ecco che cosa ho provato:

Inizialmente, ho scoperto che la ListView schiacciato eventi touch, così l'ascoltatore gesto sulla Galleria mai viene licenziato.

Quindi, nel metodo onCreate () della attività, ho creato un GestureDetector:

galleryGestureDetector = new GestureDetector(this, gallery);

Poi, all'interno del metodo GetView () dell'adattatore Gallery, dopo che il ListView è stato gonfiato e configurato, ho qualche codice come questo:

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

In questo caso ho anche andato al passo estremo di restituire vero dal OnTouchListener per assicurarsi che il metodo onTouchEvent () della ListView è mai effettivamente chiamato. Lo stesso comportamento si verifica nervoso. Di conseguenza, credo di poter escludere in competizione onTouchEvent () implementazioni tra i due punti di vista.

Ho provato abusare del concetto TouchDelegate così estendendo tocco rettangolo della Galleria di includere il ListView e poi costringendo il ListView di delegare ad essa, ma questo è stato uno sforzo inutile pure.

I getterebbe le mie mani e dire che non è possibile attualmente, ma l'applicazione di social networking che confezioni con il DroidX in qualche modo compie esso!

È stato utile?

Soluzione

Il problema è che ListView è intercettare eventi di tocco dalla Galleria e quindi alterare la posizione della vista stessa. Questo è ciò che porta all'effetto avanti e indietro jittering che vedo quando uso i widget come è. Considero questo un bug nella Galleria widget di, ma nel frattempo può essere fissato dalla sottoclasse Galleria in questo modo:

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

}

Se si utilizza BetterGallery al posto della Galleria, il tutto funziona bene!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top