2015-06-25 7 views
12

Kontekst: Mam ScrollView, który może mieć dzieci dodane do widoku zawartości podczas rzucania. Ponieważ rzutowanie jest skonfigurowane na wysokość ScrollView, to te dzieci są dodawane, jeśli dodawane są dzieci, to rzut się zatrzymuje (i faktycznie przewija się do tyłu z powodu przewyższenia), mimo że nie osiągnął dna zawartości.Jak można poprawnie kontynuować rzutowanie ScrollView podczas dodawania dzieci?

Mogę ewentualnie ponownie uruchomić rzut za pomocą #fling(int velocity), ale nie mogę znaleźć sposobu na uzyskanie aktualnej prędkości rzucania lub zatrzymania aktualnego rzutu. Jakieś pomysły?

+0

Polecam się obsługiwać ten problem jak tablicy. Umieść zawsze dwa razy tyle (lub więcej) elementów na liście, ile potrzebujesz. Druga połowa elementów, których teraz nie masz, jest pusta. Jeśli dodasz element, nie dodawaj go, ale wypełnij kolejny pusty element nowymi danymi w postaci . Jeśli przewijanie listy wchodzi do ostatniego wypełnionego elementu, zatrzymaj rzutowanie na . W ten sposób zawsze będziesz mieć ciągłe rzucanie. – JacksOnF1re

+0

@Foxichu, mam również problem, uprzejmie podziel się trochę kodu, aby rozwiązać ten problem. Jak już wspomniałeś rozwiązać ten problem za pomocą zagnieżdżonego kodu przewijania.proszę podzielić się tym. Dzięki za to. –

Odpowiedz

5

Aby odpowiedzieć na Twoje pytania od wiersza:

  • Brak API, aby uzyskać aktualną prędkość Scrollview.
  • Możesz zatrzymać bieżące rzucanie poprzez ostrożną obsługę zdarzeń dotykowych, jak opisano w poprzednim SO post.

Patrząc na ScrollView source code, używa OverScroller do obsługi zdarzeń fling. Istnieją dwa sposoby podejścia:

  1. Użyj odbicia, aby uzyskać dostęp do prywatnego pola mScroller w ScrollView. Po uzyskaniu do niej dostępu można uzyskać bieżącą prędkość za pośrednictwem publicznego interfejsu API: public float getCurrVelocity(); Korzystanie z odbicia nigdy nie jest idealne, ponieważ trzeba się martwić, że łamie on wersje Androida, ale proste odosobnione użycie może być względnie wydajne.
  2. Zastąp kod fling() method in ScrollView i stwórz OverScroller, aby śledzić przewijanie. Jeśli wszystko pójdzie dobrze, Twój Overscoller zawsze będzie w takim samym stanie, jak ten w ScrollView.

coś takiego:

@Override 
public void fling(int velocityY) 
{ 
    // Pass through fling to parent 
    super.fling(velocityY); 

    // Keep track of velocity using our own Overscoller instance 
    mOurOverscroller = mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, 
    Math.max(0, bottom - height), 0, height/2); 
} 
+1

Alternatywne podejście, które zakończyło się: wyodrębnij kod NestedScrollView z biblioteki pomocy technicznej (tj. Skopiuj go do nowej klasy) i zmodyfikuj go w razie potrzeby. – Foxichu

1

Rozwiązałem podobny problem z metodą fling @Override. Jeśli zastąpisz metodę fling na swojej klasie ScrollViewNoFling i nie zadzwonisz pod numer super.fling w tej metodzie, nie będziesz mieć pod ręką scrollView.

@Override 
public void fling (int velocity) 
{ 
    /*Scroll view is no longer going to handle scroll velocity. 
    * super.fling(velocity); 
    */ 
} 
Powiązane problemy