2014-04-17 19 views
10

Mam ViewPager, który zawiera kilka TextViews wewnątrz fragmentu, które mają różne rozmiary czcionek. Ponadto mam przyciski do zwiększania/zmniejszania rozmiaru czcionki, które obliczają rozmiar czcionki każdego textView, dodając jego domyślny rozmiar oraz wartość o nazwie STEP (która zmienia się za pomocą klawisza inc/dec size size).
Mój problem polega na tym, że widok jest wyświetlany po raz pierwszy po zastosowaniu zmian wielkości, utworzy tekstowe widoki o żądanym rozmiarze podczas onCreateView() jednak jeśli fragment został już buforowany i nie jest ponownie wywoływanyCreateView, nie wiem jak zaktualizować ich tekst Widoki uwzględniające tylko jeden z zapisanych w pamięci podręcznej fragmentów są wyświetlane na ekranie (i mogę je zaktualizować bez problemu), ale inne nie są wyświetlane (nie wiem, czy są dołączone do działania, czy nie w tym przypadku).
Innymi słowy, w jaki sposób mogę wykryć, które fragmenty są buforowane przez ViewPager i ich już wywołany onCreateView (są to fragmenty, które aktualizują swoje widoki muszą być zastosowane). Zaznaczyłem je w jasnozielonym ze znakami zapytania na zdjęciu poniżej: enter image description hereAndroid ViewPager: Aktualizuj poza ekranem, ale fragmenty z pamięci podręcznej w ViewPager

Odpowiedz

9

W celu uzyskania listy buforowanych pozycji przez ViewPager zmieniłem zasilacz których rozszerzenie niestandardowy FragmentStatePagerAdapter:

  1. Dodaj HashMap<Integer, FragmentDipsplayPageContent> cachedFragmentHashMap do mojego adaptera
  2. Aktualizacja GetItem() metoda

  3. tak

    Metoda
    public Fragment getItem(int index) {   
        Fragment fragment = new FragmentDipsplayPageContent(); 
        Bundle args = new Bundle(); 
        args.putInt("INDEX", index); 
        fragment.setArguments(args); 
        cachedFragmentHashMap.put(index,fragment); 
        return fragment; 
    } 
    
  4. Aktualizacja destroyItem() z adapterem jak ten

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
        super.destroyItem(container, position, object); 
        //add this line to remove fragments wiped from ViewPager cache 
        cachedFragmentHashMap.remove(position); 
    } 
    
  5. Dodaj getter dostępu do HashMap buforowanych fragmenty działalności:

    public HashMap<Integer, FragmentDipsplayPageContent> getCachedFragmentHashMap() { 
        return cachedFragmentHashMap; 
    } 
    
  6. aktualizacji przy użyciu tej kolekcji wewnątrz aktywność:

    private void increaseFontSizeForCachedFragments() { 
        HashMap<Integer, FragmentDipsplayPageContent> cachedFragmentsHashMap = adapterViewPager 
          .getCachedFragmentHashMap(); 
        Collection<FragmentDipsplayPageContent> fragmentsCollection = cachedFragmentsHashMap 
          .values(); 
        for (FragmentDipsplayPageContent fragmentDipsplayPageContent : fragmentsCollection) { 
         //update views of fragment 
         fragmentDipsplayPageContent.increasTextFontSize(); 
        } 
    } 
    


    W ten sposób aktualizowane są wszystkie fragmenty z pamięci podręcznej, w tym fragmenty widoczne i nieekranowane.

7

użytkowania FragmentStatePagerAdapter zamiast FragmentPagerAdapter dla adaptera ViewPager

+0

Obecnie używam FragmentStatePagerAdapter. – VSB

+0

cóż, to zadziałało dla mnie i uratowało mi czas. Dziękuję bardzo! – mohnage7

+0

Klient korzystał z programu stronicującego, tak jak gra ... i ładował dane w sprawiedliwym rozmiarze, więc wisiał po ponad 30 stronach. .. Dzięki za to rozwiązanie. –

22

Przyjęta odpowiedź jest dobra, ale nie należy buforować wszystkich elementów. Zamiast tego możesz użyć tej metody:

mViewPager.setOffscreenPageLimit(int); 

Na przykład istnieje wiele elementów z obrazem i animacjami. Jeśli przechowujesz je wszystkie w pamięci podręcznej, najprawdopodobniej otrzymasz numer OutOfMemoryError. Aby temu zapobiec, możesz zdefiniować limit strony, który będzie buforowany.

Edytuj: Zamiast HashMap<Integer, Object> lepiej jest użyć SparseArray<Object>.

+2

pytanie, w jaki sposób włączyć buforowanie, ale może uzyskać dostęp do pamięci podręcznej dla aktualizacji, gdy nie są one widoczne. – VSB

+0

Jaki jest domyślny rozmiar? – Relm

+0

jeśli używasz tego rozwiązania, jak usunąć ekran w pamięci podręcznej? Mam teraz ten problem, ponieważ strony pamięci podręcznej nie aktualizują się. –

Powiązane problemy