RecyclerView infinito de desplazamiento no funciona dentro de ViewPager2

0

Pregunta

Tengo una horizontal ViewPager2. En la segunda diapositiva de la vista de buscapersonas, tengo un RecyclerView que tiene una infinidad de desplazamiento implementado. He utilizado EndlessRecyclerViewScrollListener para implementar infinito de desplazamiento.

Sin embargo, cuando el desplazamiento hacia abajo de este RecyclerView, no desencadenar infinito de desplazamiento. Página 2 de el infinito de desplazamiento no se llama nunca, sólo la página 1.

Aquí está mi clase con el 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;
        }
    }

}

Y esta es la clase de la segunda página en el 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
    }
}

Por qué no llamar a la página 2 para la RecyclerView cuando el desplazamiento en esta situación y qué puedo hacer para solucionarlo?

Gracias!

2
0

Usted podría estar interesado en la comprobación de sus limitaciones en el ViewPager2 como se organiza el fragmento que contiene el RecyclerView - también toda la estructura de este fragmento(en el XML de diseño).

Puesto que ambos son desplazables, el layout_height y layout_width de la jerarquía de diseño afectan en gran medida cuando los acontecimientos de la recyclerView se activan, algunos de ellos nunca llegan a los detectores de eventos.

En la documentación oficial para la migración de ViewPager, hay una pequeña nota en el apoyo a la anidados desplazamiento aquí

ViewPager2 no admite de forma nativa anidada de desplazamiento vistas en los casos donde el desplazamiento de la vista tiene la misma orientación que la ViewPager2 objeto que la contiene. Por ejemplo, el desplazamiento no funcionaría para un desplazamiento vertical de la vista dentro de un orientado verticalmente ViewPager2 objeto.

Con la suposición de que su RecyclerView no está utilizando la misma orientación con el viewPagerusted puede ejecutar su fragmento en su propio y depuración para determinar si onLoadMore realmente se activa cuando no en un viewPager contexto/contenedor.

Como una nota del lado, encontrar algo de tiempo para leer en Paging3 y más allá.

2021-11-24 07:44:35

El RecyclerView es, de hecho, el uso de la misma orientación que el ViewPager, ambos son verticales.
user1695123

Mejor respuesta

0

Terminé de arreglar esto con sólo usar un diferente infinito de desplazamiento RecyclerView clase:

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

2021-12-03 17:41:04

En otros idiomas

Esta página está en otros idiomas

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