2011-01-01 5 views
5

Celem jest zaimplementowanie Galerii, której adapter zwraca ListViews (innymi słowy, przewijanie w pionie ListViews osadzone w przewijanej poziomo galerii). To trochę działa po odrobinie pracy, ale przy próbie przewijania w poziomie, ListView wygląda bardzo roztrzęsiony, jak jest trochę lepkości, aby był wyśrodkowany. Nie zaobserwowałem tego rodzaju zachowań w przypadku innego typu widoku osadzonego w galerii.Umieszczenie ListView wewnątrz Galerii

Oto co próbowałem:

Początkowo okazało się, że ListView zgniecione zdarzeń dotykowych, więc słuchacz gest na Galeria nigdy nie zostanie zwolniony.

więc w metodzie onCreate() z działalności, stworzyłem GestureDetector:

galleryGestureDetector = new GestureDetector(this, gallery);

Następnie wewnątrz metody getView() adaptera Gallery, po ListView został nadmuchany i skonfigurowany mam trochę kodu:

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

w tym przypadku nawet poszedł do skrajnego kroku powrocie prawdziwe od OnTouchListener aby upewnić się, że metoda onTouchEvent() z ListView nie jest w rzeczywistości nazywa. Występuje to samo rozwlekłe zachowanie. W rezultacie, myślę, że mogę wykluczyć konkurencyjne implementacje TouchEvent() między dwoma widokami.

Próbowałem także nadużywać koncepcji TouchDelegate, rozszerzając prostokąt dotykowy Galerii, aby uwzględnić ListView, a następnie zmuszając ListView do delegowania do niego, ale był to także daremny wysiłek.

Chciałbym wyrzucić ręce i powiedzieć, że obecnie nie jest to możliwe, ale aplikacja Social Networking, która pakuje się z DroidXem, jakoś to osiąga!

+0

Może sprawdzić, czy widoki listy nie tworzą/pompują ton po każdym renderowaniu galerii. Spróbuj ich buforować (lub po prostu używając pojedynczego pola statycznego), aby sprawdzić, czy to jest problem. – monkjack

+0

Dobra myśl monkjack, a tak naprawdę wygląda na to, że Galeria przetwarzała listę ViewViews zwróconą przez adapter po wyrejestrowaniu. Próbowałem buforować widoki, tak jak zasugerowałeś i zweryfikowałeś to z 3 elementów, których używam do testowania rozwiązań tego problemu, że tylko 3 widoki są zawsze zawyżone. Niestety, widzę ten sam rezultat ... Po tym, jak slajd ześlizgnie się po niewielkiej ilości, zaczyna drżeć jak szalony. – jkschneider

+0

Jeszcze bardziej tajemniczy - zauważyłem dzisiaj, że jeśli nadal będę próbował przewijać poziomo po tym, jak ListView zacznie drgać, galeria czasami utknie między dwoma widokami. – jkschneider

Odpowiedz

5

Problem polega na tym, że ListView przechwytuje zdarzenia dotykowe z galerii, a następnie zmienia samą pozycję widoku. To właśnie prowadzi do efektu jitteringu, który widzę, gdy używam widżetów w niezmienionej postaci. Uważam to za błąd w widgecie galerii, ale w międzyczasie może być ustalona przez instacji Gallery tak:

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

}

Jeśli używasz BetterGallery w miejscu galerii, całość działa tak w porządku!