RecyclerView scroll infinit nu lucrează în interiorul ViewPager2

0

Problema

Am o orizontală ViewPager2. Pe cel de-al doilea diapozitiv de vedere pager, am o RecyclerView care are infinit de defilare puse în aplicare. Am folosit EndlessRecyclerViewScrollListener să pună în aplicare scroll infinit.

Cu toate acestea, atunci când defilare în jos acest RecyclerViewnu declanșa defilare infinit. Pagina 2 din scroll infinit nu este niciodată numit, doar pagina 1.

Aici este clasa mea cu 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;
        }
    }

}

Și aici este clasa pentru cea de-a doua pagină în 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
    }
}

De ce nu este de asteptare pagina 2 pentru RecyclerView atunci când defilare în această situație și ce pot face pentru a remedia problema?

Multumesc!!!

2
0

Ați putea fi interesat în verificarea constrângerilor pe ViewPager2 ca acesta găzduiește fragment care conține RecyclerView -, de asemenea, întreaga structură a acestui fragment particular(în XML machete).

Din moment ce ambele sunt derulabil, la layout_height și layout_width de structura ierarhiei afecta foarte mult atunci când evenimentele de recyclerView sunt declanșate, unele dintre ele nu pot ajunge la eveniment ascultători.

În documentația oficială pentru migrarea de la ViewPager, există o mică notă privind sprijinul pentru imbricate defilare aici

ViewPager2 nu are suport nativ imbricate scroll vedere în cazurile în care alegeți view are aceeași orientare ca ViewPager2 obiect care conține acesta. De exemplu, defilare nu ar lucra pentru un scroll vertical vedere în interiorul vertical orientat spre ViewPager2 obiect.

Cu presupunerea că RecyclerView nu este folosind aceeași orientare cu viewPager, puteți rula fragment pe cont propriu și de depanare pentru a determina dacă onLoadMore este, de fapt fiind declanșată atunci când nu într-un viewPager context/container.

Ca o notă separată, găsi ceva timp pentru a citi pe Paging3 și dincolo.

2021-11-24 07:44:35

RecyclerView este, de fapt, folosind aceeași orientare ca ViewPager, ambele sunt verticale.
user1695123

Cel mai bun răspuns

0

Am ajuns la fixarea prin utilizarea unui alt infinit scroll RecyclerView clasa:

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

2021-12-03 17:41:04

În alte limbi

Această pagină este în alte limbi

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