5

Zajmuję się tworzeniem aplikacji, która pokazuje listę gier, wewnątrz itemView każdej gry, mam również listę filmów do wyświetlenia. podgląd i struktura są następujące.Czy istnieje sposób na udostępnienie tego samego menedżera LayoutManager między wieloma zagnieżdżonymi RecyclerViews

enter image description here

I wdrożyć RecyclerView jak okno widoku głównym, a następnie do filmów, użyłem siatki stylu RecyclerView do wyświetlania, więc tutaj mamy zagnieżdżone struktury RecyclerView.

Ale jest problem, ponieważ liczba filmów jest niespójna między grami, nie chcę, aby lista "RecyclerView of video" była w stanie przewijać, więc najlepszym sposobem jest zwiększenie wysokości widoku w sposób dynamiczny w zależności od tego, ile wierszy to mieć. Słyszałem rozczarowujący wniosek, że nie ma sposobu, aby to zrobić z Internetu. Czy to naprawdę? jakakolwiek alternatywa może to zrobić?

Do tej pory nie miałem pomysłu na rozwiązanie tego problemu, więc ręcznie zmieniam wysokość RecyclerView jako rozwiązanie tymczasowe.

videoGridRecyclerView.getLayoutParams().height = rowCount * 242; 

Biorąc pod uwagę, że elementy wideo są całkowicie sama struktura, byłoby miło, gdyby te RecyclerViews można ponownie wykorzystać itemViews tym filmie jest po ich już przesuń się z ekranu, zostanie on trwa znacznie lepszą poprawę wydajności.

Następnie starałem się mieć konkretny RecycledViewPool do propagowania do każdego zagnieżdżonego RecyclerViews.

public class MainActivity extends Activity { 
    private RecyclerView.RecycledViewPool mViewPool; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // create the RecycledViewPool from first and re-use for each nested RecyclerViews. 
     mViewPool = new RecyclerView.RecycledViewPool(); 
     ... 
    } 
} 

nawet ja zrobić ten wysiłek, i zachować uwagę, że metoda onCreateViewHolder być wykonane a licznik nadmuchać dostaniem wzrost podczas I swipe RecyclerView korzeniowy kołowo.

private static class VideoAdapter extends RecyclerView.Adapter<GridViewHolder> { 
    private List<Video> mVideoList; 

    private VideoAdapter(List<Video> videoList) { 
     mVideoList = videoList; 
    } 

    // this method would always invoke during i swipe the RecyclerView. 
    @Override 
    public GridViewHolder onCreateViewHolder(ViewGroup container, int viewType) { 
     Log.e("", String.format("createViewCount : %d", ++MainActivity.STAT_GAME_VIDEO_ITEM_COUNT)); 
     return new GridViewHolder(inflate(container, R.layout.game_video_item)) {}; 
    } 
} 

Czy ten mój pomysł zadziała? czy robię to źle? Chcę osiągnąć ten efekt, wszelkie inne porady, nawet jeśli nie chodzi o to, żeby RecyclerView był wdzięczny, z góry dziękuję.

Odpowiedz

3

Do tej pory użyłem GridLayout zamiast zagnieżdżonego RecyclerView, i odtwarzałem widoki, które sam znajdowałem w GridLayout. Ale to chyba nie jest dobry sposób, ponieważ moja logika recyklingu była bardzo prosta. Aplikacja wciąż lekko się zacina podczas szybkiego przewijania, nie rozumiem tego. Jako wykonalne zakończenie, wypycham mój kod w github. Proszę doradzać mi, jeśli masz pomysły, dzięki.

2

Tak, to, co robisz, jest słuszne.

Po prostu utwórz RecyclerViewPool (tak, jak to zrobiłeś) i przekaż go wszystkim instancjom RecyclerView za pośrednictwem setRecycledViewPool. W ten sposób będą dzielić tę samą pulę widoków.

Możesz zwiększyć rozmiar pamięci podręcznej, aby uniknąć pomyłek. Widoki, gdy liczba widoków między pozycjami jest bardzo różna.

Btw, jako sugestia strony, spróbuj połączyć go w jeden RecyclerView zamiast zagnieżdżonych RecyclerViews. W ten sposób animacje itp. Mogą działać znacznie ładniej. Również przewijanie w tym samym kierunku jest problematyczne, gdy używasz RV wewnątrz RV i możesz uniknąć tego problemu, łącząc je w jeden.

+2

w moim przypadku, nadal istnieje sposób, aby osiągnąć tylko jeden RecyclerView? co z siatką wideo o nieokreślonej wielkości? Szczerze mówiąc, nie chcę zagnieżdżać RecyclerViews, ale nie mogę znaleźć innego podejścia do spełnienia moich oczekiwań, jeśli rozumiem, że twoje środki są niepoprawne, czy możesz pokazać moją ilustrację lub kod? – VinceStyling

+0

@ yigit Jak zwiększyć rozmiar pamięci podręcznej? Robię setMaxRecycledViews(), która pomaga trochę, ale widzę, że onCreateViewHolder() jest nazywany zbyt wiele. Nie rozumiem, dlaczego niektóre wyświetlenia zostały utworzone zamiast poddane recyklingowi. Nie jestem nawet pewien, co zalicza się jako pierwszy parametr metody setMaxRecycledViews(). Moje recyklery mogą mieć 1 element lub maksymalnie 20 i wygląda na to, że kiedy dostanę 20 pozycji, jeden widok nie zostanie poddany recyklingowi. Czy istnieje miejsce, w którym mogę przejrzeć przykłady lub uzyskać więcej informacji na temat udostępniania puli w widokach recyklerów? Dzięki. – Sotti

Powiązane problemy