2012-12-19 17 views
16

pracuję na ListView pomysłu gdzie trzyma przewijania automatycznie bez ingerencji użytkownika i jest to absolutnie wykonalne przy użyciu Android API na przykład smoothScrollToPositionFromTop.Nieskończony Auto Scroll ListView z prędkość przewijania Controlled

I wprowadziły ListView BaseAdapter gdzie załadować przedmioty zawsze (prawie), aby uzyskać zakaz zatrzymywania samo powtórzył ListView.

Co chcę osiągnąć jest, aby utrzymać moje ListView przewijanie zawsze z pewną prędkością (wolne), aby przedmioty jasny i czytelny podczas przewijania w dół, nie wiem jeszcze czy ListView jest moim najlepszym wyborem tutaj.

Poniżej znajduje się urywek tego, co próbuję zrobić. wynik jest jakoś dobry, ale nie jest wystarczająco gładki, czuję, że ListView migocze.

Muszę poprawić gładkość, efektywności i kontrolować prędkość

new Thread(new Runnable() { 

    @Override 
    public void run() { 
     int listViewSize = mListView.getAdapter().getCount(); 

     for (int index = 0; index < listViewSize ; index++) { 
      mListView.smoothScrollToPositionFromTop(mListViewA.getLastVisiblePosition() + 100, 0, 6000); 
      try { 
       // it helps scrolling to stay smooth as possible (by experiment) 
       Thread.sleep(60); 
      } catch (InterruptedException e) { 

      } 
     } 
    } 
}).start(); 
+1

Więc jaki jest problem? Osiągnąłeś tę funkcjonalność (nieskończone przewijanie), ale chcesz poprawić płynność/wydajność/spowolnić? – breadbin

+0

Zdefiniuj "nie wystarczająco gładki". Może to wynikać z części adaptera, niektóre elementy mogą być powolne do załadowania. – njzk2

+0

@breadbin: zaktualizowano, njzk2 "nie jest wystarczająco gładki" Chodzi mi o to, że widzę, jak lista się zwalnia, a następnie przewija ponownie, co powoduje opóźnienie. Potrzebuję przewijania, aby zostać jednym strzałem i na zawsze. –

Odpowiedz

15

Sugeruję, że twój adapter został wdrożony w efektywny sposób. więc ten kod jest tylko przewija ListView

trzeba spróbować innego wartości zmiennych

final long totalScrollTime = Long.MAX_VALUE; //total scroll time. I think that 300 000 000 years is close enouth to infinity. if not enought you can restart timer in onFinish() 

final int scrollPeriod = 20; // every 20 ms scoll will happened. smaller values for smoother 

final int heightToScroll = 20; // will be scrolled to 20 px every time. smaller values for smoother scrolling 

listView.post(new Runnable() { 
         @Override 
         public void run() { 
           new CountDownTimer(totalScrollTime, scrollPeriod) { 
            public void onTick(long millisUntilFinished) { 
             listView.scrollBy(0, heightToScroll); 
            } 

           public void onFinish() { 
            //you can add code for restarting timer here 
           } 
          }.start(); 
         } 
        }); 
+0

wydaje się być eleganckim rozwiązaniem, nie jestem teraz na mojej maszynie programistycznej, aby go przetestować, dam ci znać tak szybko, jak tylko będę mógł. –

+3

nie ma wątpliwości, że zasługujesz na nagrodę, ale istnieje niepokój związany z 'ListView' w moim nieskończonym adapterze, kiedy listview scrollBy się wydaje' getView (...) 'nie zostaje wywołany, więc widzę pustą komórkę po ostatnia komórka zostanie przewinięta, czy muszę przewijać listę 'ListView' podczas przewijania? –

+0

Zrobiłem kilka aplikacji testowych dla tego http://pastebin.com/9fUTuR1u Masz rację - scrollBy przewija listę w niewłaściwy sposób. Ale zadziałało to dla mnie w ScrollView. BTW, jeśli masz niewielką liczbę pozycji w widoku listy, możesz dodać więcej płynności do przewijania, jeśli wypróbujesz ScrollView z Linearlayout w nim ze wszystkimi Twoimi przedmiotami. – Berezovskyi

-1

Oto kilka wskazówek: Simulate onFling() programmatically instead of detecting it (Android)

i Programmatically Fling ListView Android

Trudno zorientować się, co nazywasz wystarczająco gładka w Twoim przypadku. Zwykle problemy z gładkością są związane z nieoptymalnym wykorzystaniem odsłon i problemów w układach komórek lub przeglądaniem tworzenia/recyklingu w metodzie getView adapterów. Czy masz use a placeholder? Ważną rzeczą do rozważenia jest również Drawables usage.

nigdy nie osiągnąć to, czego szukasz, ale prosty pomysł, który przychodzi do głowy to:

  • znaleźć sposób, aby przewinąć widok pozycji 1 lub 2.
  • użyć bufor pierścieniowy wewnątrz twój adapter. Na przykład załóżmy, że masz 100 pozycji na liście przedmiotów. Na początku pozycja 0 listy jest pozycją 0 twojej listy. Gdy lista jest przewijana o 1 pozycję, pozycja 0 listy powinna stać się pozycją 1 na twojej liście. W związku z tym problem nie będzie przewijany, ale będzie bardziej synchronizowany z przewijaniem i wyświetlaniem nieskończonej listy elementów.
+0

Bardzo dziękuję za trud odpowiedzi na moje pytanie, porozmawiajmy o tym: ** Pierwszy ** pierwszy link używa 'InstrumentationTestCase', który, jak sądzę, nie mogę go używać w mojej aplikacji mam na myśli w zwykłej Działalności (popraw mnie jeśli się mylę). ** 2nd ** drugi link nie ma nic wspólnego z moim problemem, przeszedłem problem/implementację automatycznego przewijania. ** 3rd ** Tak, absolutnie używam posiadaczy miejsc. ** 4th ** Mam zero obaw dotyczących implementacji nieskończonego adaptera :) –

+0

co spowolnić automatyczne przewijanie ListView? –

+0

Możesz spróbować przewinąć przez przesunięcie zamiast pozycji: http://developer.android.com/reference/android/widget/ListView.html#smoothScrollByOffset(int) – Snicolas