ViewPager 滑动不适用于 RecyclerView

Posted

技术标签:

【中文标题】ViewPager 滑动不适用于 RecyclerView【英文标题】:ViewPager swipe doesn't work with RecyclerView 【发布时间】:2015-10-25 07:45:36 【问题描述】:

我想使用 ViewPager 实现一个简单的滑动导航,该 ViewPager 带有保存和管理 RecyclerView 的片段。

Fragments 已创建,可以使用setCurrentItem() 进行切换,但不能左右滑动切换页面。 ViewPager 似乎忽略了任何滑动手势。

我的活动布局:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_
    android:layout_>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_
        android:layout_
        android:layout_marginTop="?attr/actionBarSize"/>

    <android.support.v7.widget.Toolbar
                  ...                 />

</FrameLayout>

我在我的onCreate() 中使用FragmentPagerAdapter 填充 ViewPager,如下所示:

viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.addOnPageChangeListener(this);
viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) 
       @Override
       public Fragment getItem(int position) 
           switch (position) 
               case 0:
                   return new Dummy2Fragment();

               case 1:
                   return new Dummy2Fragment();

               default:
                   return null;
           
        

       @Override
       public int getCount() 
           return 2;
       

       @Override
       public CharSequence getPageTitle(int position) 
           return "Dataset " + (position + 1);
       
   );

片段布局是一个简单的FrameLayout,它包装了一个 RecyclerView:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_
        android:layout_
        android:background="@color/background_material_light"/>

</FrameLayout>

适配器和布局管理器设置在片段的onCreateView:

recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 6, LinearLayoutManager.VERTICAL, false));

编辑#1

我想我的问题问得不够清楚。 我有一个工作分页器,其工作 TabLayout 由“FragmentPagerAdapter”填充,这意味着片段已正确创建,并且选项卡布局显示每个项目的可点击选项卡。此 ViewPager 中的每个 Fragment 都显示一个 RecyclerView 和一个 GridLayoutManager

但是,ViewPager 似乎没有收到任何滑动手势,您可以通过TabLayout 更改当前选定的位置,但不能通过例如从左向右滑动来更改当前选定位置。 无论布局方向如何,RecyclerView 似乎都会消耗所有滑动事件,设置为vertical

有什么想法吗?

【问题讨论】:

androidbeasts.wordpress.com/2015/08/11/tabs-with-swipe-views/… 【参考方案1】:

您可以像这样将 tablayout 与 Viewpager 一起使用

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.CoordinatorLayout    
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/main_content"
    android:layout_
    android:layout_>

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_
    android:layout_

    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_
        android:layout_

        />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_
    android:layout_
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />


 </android.support.design.widget.CoordinatorLayout>

也设置

   tabLayout = (TabLayout) rv.findViewById(R.id.tabs);
   tabLayout.setupWithViewPager(viewPager);

和setupWithViewPager方法类似

  private void setupViewPager(ViewPager viewPager) 
      adapter = new Adapter(getChildFragmentManager());
      adapter.addFragment(new MatesListFragment(), "Mates");
      adapter.addFragment(new FavoursListFragment(), "Favours");
      adapter.addFragment(new FavemeListFragment(), "FavMe");
        viewPager.setAdapter(adapter);



 class Adapter extends FragmentPagerAdapter 
    private final List<Fragment> mFragments = new ArrayList();
    private final List<String> mFragmentTitles = new ArrayList();

    public Adapter(FragmentManager fm) 
        super(fm);
    

    public void addFragment(Fragment fragment, String title) 
        mFragments.add(fragment);
        mFragmentTitles.add(title);
    

    @Override
    public Fragment getItem(int position) 
        return mFragments.get(position);
    

    @Override
    public int getCount() 
        return mFragments.size();
    

     public int getItemPosition(Object object) 
         return POSITION_NONE;
     
    @Override
    public CharSequence getPageTitle(int position) 
        return mFragmentTitles.get(position);
    

在 MatesListFragment、FavoursListFragment 等中,你有你的 RecyclerView 布局

【讨论】:

感谢您的回复。我想你误解了我的问题,我想知道为什么 ViewPagers 滑动功能不起作用。我也有一个包含选项卡布局的活动版本,但那里也忽略了滑动手势。

以上是关于ViewPager 滑动不适用于 RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式滑动时更改 ViewPager2 滚动速度

TouchImageView 不适用于 ViewPager

<activity> windowSoftInoutMode 不适用于 ViewPager 中的片段

如何在android中实现视图滑动

使用 viewpager 实现滑动抽屉,滑动抽屉位于 viewpager 上

Android ViewPager嵌套ViewPager滑动冲突处理方法