recycleview嵌套viewpager与Fragment结合使用

什么是ViewPager

ViewPager是v4包中的一个类,继承自ViewGroup,是一个容器。

ViewPager布局管理器允许翻转带数据的页面,可以通过实现PagerAdapter来显示视图。

ViewPager经常用来连接Fragment,它能够方便的管理每个页面的生命周期,ViewPager通过适配器管理Fragment,常用的适配器有FragmentPagerAdapter和FragmentStatePagerAdapter。

一、布局中添加控件

使用场景:recycleview中嵌套viewpager,这里自定义viewpger,实现滑动事件焦点问题。viewpger到最后一页将焦点交出

<com.test.demo.view.customview.OutScrollViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="260dp"
            android:layout_marginTop="20dp" />

二、布局中调用

     ViewPager viewPager = helper.getView(R.id.viewpager);

三、自定义adapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public SectionsPagerAdapter(@NonNull FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    public SectionsPagerAdapter(@NonNull FragmentManager fm) {
        super(fm);
    }

    public void setData(List<Fragment> fragments) {
        this.fragments = fragments;
        notifyDataSetChanged();
    }


    @NonNull
    @Override
    public Fragment getItem(int position) {
        if (fragments != null) {
            return fragments.get(position);
        } else {
            return new Fragment();
        }
    }

    @Override
    public int getCount() {
        if (fragments != null) {
            return fragments.size();
        } else {
            return 0;
        }
    }

    @Override
    public int getItemPosition(@NonNull Object object) {
        return POSITION_NONE;
    }
}

四、设置适配器

  1. getSupportFragmentManager():
    v4包中的Fragment可以通过getSupportFragmentManager()方法获得;
    getSupportFragmentManager()主要用于支持 3.0以下android系统API版本,

  2. getFragmentManager()
    Android自带的Fragment可以通过getFragmentManager()方法获得。
    3.0以上系统可以直接调用getFragmentManager()

  3. getChildFragmentManager()
    Fragment嵌套Fragment要用getChildFragmentManager().
    getChildFragmentManager() 所得到的是在 fragment 里面子容器的管理器。

//1.如果所有ViewPager不显示,RecyclerView的item必须要个高度,所以要给Viewpager设置一个固定高度
//2.如果只有第一项显示,其他项的viewpager不显示, ViewPager在同一个页面中,不允许存在相同的id,需要给不同的viewpager设置不同的ID,不要设置为0,否则会不显示
 viewPager.setId(helper.getAdapterPosition() + 1);
                //adapter中的复用
                if (viewPager.getAdapter() == null) {
                    SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(childFragmentManager);
                    viewPager.setAdapter(sectionsPagerAdapter);
                }
                ((SectionsPagerAdapter) viewPager.getAdapter()).setData(fragmentList);

五、自定义的viewpager,recycleview嵌套viewpager滑动事件处理

viewpager由右向左滑动到最后一项,父容器拦截响应事件
viewpager由左向右滑动到第一条,父容器拦截响应事件

public class OutScrollViewPager extends ViewPager {


    public OutScrollViewPager(@NonNull Context context) {
        super(context);
    }

    public OutScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }


    // 用于标记滑动的坐标
    private int downX = 0;
    private int downY = 0;


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int x = (int) ev.getX();
        int y = (int) ev.getY();
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                downX = x;
                downY = y;
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                int deltaX = x - downX;
                int deltaY = y - downY;
                //左右滑动
                if(Math.abs(deltaX) < Math.abs(deltaY)){
                    getParent().requestDisallowInterceptTouchEvent(true);
                }else {
                    if (deltaX < 0) {
                        //由右向左移动,最后一个点,翻转整个模块
                        if (getCurrentItem() == getAdapter().getCount() - 1) {
                            getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                        } else if (getCurrentItem() < getAdapter().getCount() - 1) {
                            getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
                        }
                    } else {
                        //由左向右移动,第一个点,翻转整个模块
                        if (getCurrentItem() == 0) {
                            getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
                        } else if (getCurrentItem() > 0) {
                            getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
                        }
                    }
                }
                break;
            }
            case MotionEvent.ACTION_UP: {
                getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }
        }
        //赋值

        return super.dispatchTouchEvent(ev);
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我是一名语言模型,无法为您编写完整的安卓程序。但是,我可以提供一些关键点和示例代码,供您参考。 要创建一个包括 Fragment 和 ListViewRecyclerViewViewPager 相关高级组件的安卓程序,您需要使用 Android Studio 进行开发,并在 Gradle 文件中添加相应的依赖项。下面是一些关键步骤: 1. 创建一个新的 Android 项目,并选择空白活动模板。 2. 在 Gradle 文件中添加以下依赖项: ``` dependencies { implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:design:28.0.0' } ``` 3. 创建 Fragment 和 ListView: - 您可以创建一个新的 Fragment 类,并在其中添加一个 ListView 控件。在 onCreateView() 方法中,使用 LayoutInflater 实例化视图并返回它。例如: ``` public class MyFragment extends Fragment { private ListView listView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_layout, container, false); listView = view.findViewById(R.id.list_view); // 设置适配器、监听器等 return view; } } ``` - 在布局文件中定义 Fragment: ``` <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 4. 创建 RecyclerView: - 在布局文件中添加一个 RecyclerView 控件。例如: ``` <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` - 在代码中实例化 RecyclerView,并设置适配器和布局管理器。例如: ``` RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(new MyAdapter(data)); ``` - 创建一个自定义的 RecyclerView.Adapter 类,并实现必要的方法。例如: ``` public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> { private List<String> data; public MyAdapter(List<String> data) { this.data = data; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.textView.setText(data.get(position)); } @Override public int getItemCount() { return data.size(); } } public class MyViewHolder extends RecyclerView.ViewHolder { public TextView textView; public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.text_view); } } ``` 5. 创建 ViewPager: - 在布局文件中添加一个 ViewPager 控件和一个 TabLayout 控件: ``` <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="fixed" app:tabGravity="fill" /> ``` - 在代码中实例化 ViewPager,并设置适配器和 TabLayout。例如: ``` ViewPager viewPager = findViewById(R.id.view_pager); viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); TabLayout tabLayout = findViewById(R.id.tab_layout); tabLayout.setupWithViewPager(viewPager); ``` - 创建一个自定义的 FragmentPagerAdapter 类,并实现必要的方法。例如: ``` public class MyPagerAdapter extends FragmentPagerAdapter { private String[] titles = {"Tab 1", "Tab 2", "Tab 3"}; public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return MyFragment.newInstance(position + 1); } @Override public int getCount() { return titles.length; } @Override public CharSequence getPageTitle(int position) { return titles[position]; } } ``` 希望这些示例代码能够帮助您开始编写您自己的安卓程序。请注意,这些示例代码仅供参考,您需要根据自己的需求进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值