RecyclerView scorrimento infinito non funziona all'interno ViewPager2

0

Domanda

Ho un orizzontale ViewPager2. Nella seconda diapositiva di vista cercapersone, ho un RecyclerView che ha lo scorrimento infinito di attuazione. Ho usato EndlessRecyclerViewScrollListener per implementare scorrimento infinito.

Tuttavia, quando lo scorrimento verso il basso questo RecyclerViewnon innescare lo scorrimento infinito. Pagina 2 di scorrimento infinito non è mai chiamato, solo la pagina 1.

Qui è la mia classe con la ViewPager2:

public class BaseBottomNavigationViewActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    // The number of pages in the bottom navigation view
    private static final int NUM_PAGES = 5;

    // The view pager
    private ViewPager2 viewPager;

    // The pager adapter
    private FragmentStateAdapter pagerAdapter;

    // The bottom navigation view
    private BottomNavigationView bottomNavigationView;

    private NewPostBottomSheetDialogFragment newPostModalDialog;

    private RelativeLayout newPostButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        viewPager = findViewById(R.id.view_pager);
        bottomNavigationView = findViewById(R.id.bottom_navigation_view);

        // The number of screens to keep in memory
        viewPager.setOffscreenPageLimit(5);

        // Disable swiping in the view pager
        viewPager.setUserInputEnabled(false);

        // Set the pager adapter
        pagerAdapter = new BottomNavigationViewPagerAdapter(this);
        viewPager.setAdapter(pagerAdapter);

        // Register the item selected listener
        bottomNavigationView.setOnNavigationItemSelectedListener(this);

        // Set default selection (home)
        bottomNavigationView.setSelectedItemId(R.id.action_first);
    }

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_base_bottom_navigation_view;
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_first:
                viewPager.setCurrentItem(0, false);
                break;
            case R.id.action_second:
                viewPager.setCurrentItem(1, false);
                break;
            case R.id.action_third:
                return false;
            case R.id.action_fourth:
                viewPager.setCurrentItem(3, false);
                break;
            case R.id.action_fifth:
                viewPager.setCurrentItem(4, false);
                break;
            default:
                break;
        }

        return true;
    }

    private static class BottomNavigationViewPagerAdapter extends FragmentStateAdapter {
        public BottomNavigationViewPagerAdapter(FragmentActivity fa) {
            super(fa);
        }

        @Override
        public Fragment createFragment(int position) {
            switch (position) {
                case 0:
                    return new FirstPageFragment();
                case 1:
                    return new SecondPageFragment();
                case 2:
                    return new ThirdPageFragment();
                case 3:
                    return new FourthPageFragment();
                case 4:
                    return new FifthPageFragment();
            }

            return null;
        }

        @Override
        public int getItemCount() {
            return NUM_PAGES;
        }
    }

}

E qui è la classe per la seconda pagina ViewPager2:

public class SecondPageFragment extends Fragment {

    private MyAdapter myAdapter;

    private LinearLayoutManager layoutManager;

    private RecyclerView recyclerView;

    private EndlessRecyclerViewScrollListener scrollListener;

    private List<Object> objects = new ArrayList<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_page_two, parent, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        recyclerView = view.findViewById(R.id.recycler_view);

        layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);

        myAdapter = new MyAdapter(getContext(), layoutManager, objects);
        recyclerView.setAdapter(myAdapter);

        scrollListener = new EndlessRecyclerViewScrollListener(layoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
                getData(page);
            }
        };
        recyclerView.addOnScrollListener(scrollListener);
    }

    private void getData(final int page) {
        // Here I call the API to fetch the data and add them to the objects list
    }
}

Perché non è chiamata a pagina 2 per la RecyclerView quando lo scorrimento in questa situazione e cosa posso fare per risolvere il problema?

Grazie!

2
0

Potreste essere interessati in controllo di vincoli ViewPager2 in quanto ospita il frammento contenente la RecyclerView - anche l'intera struttura di questo particolare frammento di XML nel tuo layout).

Dal momento che entrambi sono scorrevoli, il layout_height e layout_width il layout della gerarchia influenzare notevolmente quando gli avvenimenti recyclerView sono attivati, alcuni di loro potrebbe non raggiungere mai il listener di eventi.

Nella documentazione ufficiale per la migrazione da ViewPager, c'è una piccola nota sul supporto per nested scorrimento qui

ViewPager2 non supporta in modo nativo nidificato di scorrimento viste nei casi in cui la scroll view ha lo stesso orientamento della ViewPager2 oggetto che la contiene. Per esempio, lo scorrimento non avrebbe funzionato per un scorrimento verticale vista all'interno di un orientamento verticale ViewPager2 oggetto.

Con il presupposto che il tuo RecyclerView non utilizza lo stesso orientamento con l' viewPagerè possibile eseguire il frammento e il debug per determinare se onLoadMore in realtà è innescata quando non è in viewPager contesto/contenitore.

Come nota a margine, trovare il tempo di leggere su Paging3 e di là.

2021-11-24 07:44:35

Il RecyclerView con lo stesso orientamento come il ViewPager, sia in senso verticale.
user1695123

Migliore risposta

0

Ho finito di fissaggio questo da solo utilizzando un diverso scorrimento infinito RecyclerView classe:

https://stackoverflow.com/a/26561717/14968122

2021-12-03 17:41:04

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................