2013-05-20 17 views
10

Ich habe eine ViewPager mit einigen Fragmenten. Jedes Fragment hat eine ListView in einer SlidingDrawer (= unsichtbar vor dem Wischen) mit einer ArrayAdapter.ViewPager + Adapter im Fragment => laggy swiping

Adapter ist auf onCreateView() gesetzt, das verlangsamt Wischen, weil 30 Listenelemente jedes Mal, wenn ich wische, geladen werden müssen, weil neue Fragmente erstellt werden.

Meine Frage ist, ob es möglich ist, den Adapter nach dem Wischen zu setzen, wenn es ViewPager im Leerlauf ist? Oder gibt es einen besseren Weg? Die Liste muss bereits geladen sein, wenn der SlidingDrawer erweitert wird.

Antwort

3

Meine Frage ist, ob es möglich ist, den Adapter nach dem Streichen zu setzen, wenn es Pager im Leerlauf ist?

Es ist die OnPageChangeListener, die Sie auf den ViewPager einstellen könnten die Swipe-Gesten zu überwachen. Sie können dann die Methode onPageSelected() (oder onPageScrollStateChanged() zur Überwachung des aktuellen Zustands) verwenden, um benachrichtigt zu werden, wenn eine neue Seite ausgewählt wurde, und von dieser Methode aus das Laden von Daten zu starten.

Stellen Sie außerdem sicher, dass die ListView für die Verzögerung und nicht für einen anderen Teil Ihres Codes verantwortlich sind.

+0

ich kommentierte den setAdapter Anruf und es war glatter. onPageSelected ist eine gute Idee, aber ich bekomme nur die Positionsnummer, wie man die aktuelle Instanz von Fragment – metinkale38

+0

@ metinkale38 bekommt. Es hängt davon ab, welche Art von Adapter Sie verwenden, siehe die beiden oberen Antworten in dieser Frage http://stackoverflow.com/questions/7379165/update-data-in-listenfragment-as-part-of-viewpager? answertab = votes # tab-top – Luksprog

+0

danke OnPageChangeListener ist eine gute Idee, es glatter als zuvor, wenn ich nicht 2 Seiten sofort wischen nacheinander. Auf Ihrem Link habe ich diesen Link gefunden: http://tamsler.blogspot.nl/2011/11/android-viewpager-and-fragments-part-ii.html und ich habe die 2. Methode verwendet, um die Fragment-Instanz zu erhalten – metinkale38

16

Ich hatte ein ähnliches Problem ... Ich benutzte Zuhörer. Dennoch, wenn Sie zwei Seiten zurück Swipe es laggy war zu unterstützen ... Ich tat dies so etwas wie, dass die Erfahrung verbessert ....

viewpager.setOnPageChangeListener(new OnPageChangeListener() { 
    int positionCurrent; 
    boolean dontLoadList; 
    @Override 
    public void onPageScrollStateChanged(int state) { 
     if(state == 0){ // the viewpager is idle as swipping ended 
       new Handler().postDelayed(new Runnable() { 
        public void run() { 
         if(!dontLoadList){ 
         //async thread code to execute loading the list... 
         } 
        } 
       },200); 
      } 
     } 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     positionCurrent = position; 
     if(positionOffset == 0 && positionOffsetPixels == 0) // the offset is zero when the swiping ends{ 
      dontLoadList = false; 
     } 
     else 
      dontLoadList = true; // To avoid loading content for list after swiping the pager. 
    } 

} 

Wenn Sie nehmen ein paar Milli Sekunden, um die Liste zu laden, wie kommt Ergänzung zum Viewpager, es ist ok in Bezug auf UX, anstatt eine schlechte Wischen Erfahrung ... Also, die Idee ist es, warten auf 400ms im Thread vor dem Laden der Liste und stellen Sie sicher, dass Sie tatsächlich nicht Inhalt laden, wenn der Benutzer ist versuchen, schnell zu wischen, um den viewpager Inhalt zu sehen ...

Verwandte Themen