RecyclerView sonsuz kaydırma ViewPager2 içinde çalışmıyor

0

Soru

Yatayımım var. ViewPager2. Görünüm çağrı cihazının ikinci slaytında, bir RecyclerView bu sonsuz kaydırma uygulanmış. Sonsuz kaydırma uygulamak için EndlessRecyclerViewScrollListener kullandım.

Ancak, bunu aşağı kaydırırken RecyclerView sonsuz kaydırmayı tetiklemez. Sonsuz kaydırmanın 2. sayfası hiçbir zaman çağrılmaz, yalnızca 1.sayfa.

İşte benim sınıfım 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;
        }
    }

}

Ve işte ikinci sayfa için sınıf 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
    }
}

Neden sayfa 2'yi çağırmıyor RecyclerView bu durumda kaydırma yaparken ve düzeltmek için ne yapabilirim?

Teşekkürler!

2
0

RecyclerView içeren parçayı barındırdığı için ViewPager2 üzerindeki kısıtlamalarınızı kontrol etmek isteyebilirsiniz - ayrıca bu parçanın tüm yapısı(XML düzenlerinizde).

Her ikisi de kaydırılabilir olduğundan, layout_height ve layout_width düzen hiyerarşisi, recyclerView olayları tetiklendiğinde büyük ölçüde etkilenir, bazıları hiçbir zaman olay dinleyicilerine ulaşamayabilir.

Viewpager'dan geçiş için resmi belgelerde, burada iç içe kaydırma desteği hakkında küçük bir not var

Kaydırma görünümünün, onu içeren ViewPager2 nesnesiyle aynı yöne sahip olduğu durumlarda ViewPager2 iç içe kaydırma görünümlerini doğal olarak desteklemez. Örneğin, kaydırma, dikey olarak yönlendirilmiş ViewPager2 nesnesinin içindeki dikey kaydırma görünümü için çalışmaz.

Recyclerview'ınızın aynı yönlendirmeyi kullanmadığı varsayımıyla viewPager, parçanızı kendi başına çalıştırabilir ve aşağıdakileri belirlemek için hata ayıklayabilirsiniz onLoadMore aslında a'da değilken tetikleniyor mu viewPager bağlam / kapsayıcı.

Bir yan not olarak, Sayfa3 ve sonrasında okumak için biraz zaman bulun.

2021-11-24 07:44:35

RecyclerView aslında ViewPager ile aynı yönlendirmeyi kullanıyor, her ikisi de dikey.
user1695123

En iyi cevabı

0

Bunu sadece farklı bir sonsuz kaydırma RecyclerView sınıfı kullanarak düzelttim:

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

2021-12-03 17:41:04

Diğer dillerde

Bu sayfa diğer dillerde

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