RecyclerView rolagem infinita não trabalhar no interior ViewPager2

0

Pergunta

Eu tenho um horizontal ViewPager2. No segundo slide de vista pager, eu tenho um RecyclerView que tem rolagem infinita implementado. Eu usei EndlessRecyclerViewScrollListener para implementar rolagem infinita.

No entanto, quando se deslocar para baixo isso RecyclerView, ele não aciona a rolagem infinita. Página 2 de rolagem infinita nunca é chamado, apenas a página 1.

Aqui é a minha classe, com a 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 aqui é a classe para a segunda página do 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 que não chamar a página 2 para o RecyclerView quando rolar nesta situação e o que posso fazer para corrigir isso?

Obrigado!

2
0

Você pode estar interessado em verificar as restrições sobre o ViewPager2 como ele hospeda o fragmento contendo o RecyclerView - também toda a estrutura deste fragmento particular(no XML de layout).

Uma vez que ambos são roláveis, o layout_height e layout_width da hierarquia de layout afetar significativamente quando os eventos do recyclerView são acionados, alguns deles podem nunca chegar os ouvintes de evento.

Na documentação oficial para a migração do ViewPager, há uma pequena nota sobre o suporte para aninhados rolagem aqui

ViewPager2 não oferece suporte nativo a aninhadas deslocamento vistas nos casos em que o deslocamento de vista tem a mesma orientação, como o ViewPager2 objeto que o contém. Por exemplo, o deslocamento não gostaria de trabalhar para um deslocamento vertical de vista dentro de uma orientado verticalmente ViewPager2 objeto.

Com a suposição de que seu RecyclerView não está usando a mesma orientação, com o viewPager, você pode executar o objeto em sua própria e de depuração para determinar se onLoadMore é, na verdade, está sendo acionado quando não em um viewPager contexto/recipiente.

Como uma nota lateral, encontrar algum tempo para ler sobre Paging3 e além.

2021-11-24 07:44:35

O RecyclerView está de fato usando a mesma orientação, como o ViewPager, ambos são verticais.
user1695123

Melhor resposta

0

Acabei de fixação isso apenas usando uma diferente rolagem infinita RecyclerView classe:

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

2021-12-03 17:41:04

Em outros idiomas

Esta página está em outros idiomas

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