RecyclerView infini défilement ne fonctionne pas à l'intérieur de ViewPager2

0

La question

J'ai une horizontale ViewPager2. Sur la deuxième diapositive de la vue de radiomessagerie, j'ai un RecyclerView possède une infinité de défilement de mise en œuvre. J'ai utilisé EndlessRecyclerViewScrollListener à mettre en œuvre infinie de défilement.

Toutefois, lorsque le défilement en bas de cette RecyclerViewil ne déclenche pas infini défilement. Page 2 de l'infini défilement n'est jamais appelée, seule la page 1.

Voici ma classe avec le 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;
        }
    }

}

Et ici, c'est la classe pour la deuxième page de l' 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
    }
}

Pourquoi n'est-il pas l'appel de la page 2 pour la RecyclerView lors du défilement dans cette situation et que puis-je faire pour le réparer?

Merci!

2
0

Vous pourriez être intéressé par la vérification de vos contraintes sur la ViewPager2 car elle accueille le fragment contenant le RecyclerView - aussi l'ensemble de la structure de ce fragment(en XML (présentation).

Puisque les deux sont défilement, la layout_height et layout_width de la mise en page de la hiérarchie affecter grandement quand les événements de la recyclerView sont déclenchées, certains d'entre eux peuvent ne jamais atteindre les écouteurs d'événement.

Dans la documentation officielle pour la migration de ViewPager, il y a une petite note sur le soutien imbriquée défilement ici

ViewPager2 ne supporte pas imbriquée de défilement des vues dans les cas où le défilement de la vue a la même orientation que l'ViewPager2 objet qui le contient. Par exemple, le défilement ne serait pas travailler pour un défilement vertical vue à l'intérieur d'une orientés verticalement ViewPager2 objet.

Avec l'hypothèse que votre RecyclerView n'est pas en utilisant la même orientation avec les viewPager, vous pouvez exécuter votre fragment sur son propre et de débogage afin de déterminer si onLoadMore est effectivement déclenchée lorsqu'il n'est pas un viewPager contexte/conteneur.

Comme une note de côté, trouver un peu de temps à lire sur Paging3 et au-delà.

2021-11-24 07:44:35

Le RecyclerView est en fait en utilisant la même orientation que le ViewPager, les deux sont à la verticale.
user1695123

La meilleure réponse

0

J'ai fini par corriger cela en utilisant simplement un autre infini défilement RecyclerView classe:

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

2021-12-03 17:41:04

Dans d'autres langues

Cette page est dans d'autres langues

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