首页 > 其他分享 >Android开发 - (适配器)Adapter类中FragmentPagerAdapter实现类详细解析

Android开发 - (适配器)Adapter类中FragmentPagerAdapter实现类详细解析

时间:2024-08-01 21:50:54浏览次数:8  
标签:FragmentPagerAdapter return Fragment ViewPager Adapter public int position 适配器

简介

  • 用于 ViewPager,与 Fragment 一起使用,适合少量静态页面

具体作用

  • FragmentPagerAdapter 专用于在 ViewPager 中管理和显示 Fragment它允许你在滑动视图(ViewPager)中实现分页功能每个页面都是一个 FragmentFragmentPagerAdapter 适用于需要管理少量 Fragment 的场景,因为它会将所有的 Fragment 一次性加载到内存中保持它们的生命周期避免频繁地创建和销毁 Fragment。它的主要用途为:

    分页显示

    • FragmentPagerAdapter 允许在 ViewPager 中展示多个 Fragment,并通过左右滑动进行页面切换

    管理 Fragment 生命周期

    • 通过 FragmentPagerAdapter每个 Fragment 只会创建一次保持在内存中,这样可以更有效地管理 Fragment 的生命周期避免频繁的销毁和重建

    适用于少量 Fragment

    • FragmentPagerAdapter 适合于 Fragment 数量较少的情况(通常少于 5 个)因为它会将所有 Fragment 对象保存在内存中

参数、方法解析

  • FragmentPagerAdapter(FragmentManager fm):这是 FragmentPagerAdapter 最基本的构造方法适用于早期的 Android 版本FragmentManager 用于在适配器中添加、移除或替换 Fragment这是抽象类无法直接实例化,需要重写一个子类继承它

    public class MyPagerAdapter extends FragmentPagerAdapter {
    
        private int numOfTabs;
    
        public MyPagerAdapter(@NonNull FragmentManager fm, int numOfTabs) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
            this.numOfTabs = numOfTabs;
        }
    
        @NonNull
        @Override
        public Fragment getItem(int position) {
            // 根据 position 返回对应的 Fragment 实例
            return PageFragment.newInstance(position + 1);
        }
    
        @Override
        public int getCount() {
            // 返回 Fragment 的总数量
            return numOfTabs;
        }
    }
    // 实例化,并传入 FragmentManager 和 tab 的数量
    MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), 3);
    
    • 参数解析
      • fmFragmentManager;用于管理 Fragment 的事务
  • FragmentPagerAdapter(FragmentManager fm, int behavior)此构造方法允许你指定适配器的行为模式,从而更好地控制 Fragment 的生命周期管理这是抽象类无法直接实例化,需要重写一个子类继承它

    public class MyPagerAdapter extends FragmentPagerAdapter {
    
        private int numOfTabs;
    
        public MyPagerAdapter(@NonNull FragmentManager fm, int numOfTabs) {
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); // 使用 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
            this.numOfTabs = numOfTabs;
        }
    
        @NonNull
        @Override
        public Fragment getItem(int position) {
            // 根据 position 返回对应的 Fragment 实例
            return PageFragment.newInstance(position + 1);
        }
    
        @Override
        public int getCount() {
            // 返回 Fragment 的总数量
            return numOfTabs;
        }
    }
    // 实例化,并传入 FragmentManager 和 tab 的数量
    MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), 3);
    
    • 参数解析
      • fmFragmentManager;用于管理 Fragment 的事务
      • behavior:表示适配器的行为类型;可以是以下常量之一:
        • BEHAVIOR_SET_USER_VISIBLE_HINT:在 API 24 及更低版本中使用,这种行为控制 Fragment 的可见性
        • BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT推荐使用的行为模式,表示只有当前可见的`Fragment 会被设置为活动状态(Resumed)
  • adapter.instantiateItem(ViewGroup container, int position)根据给定的位置创建 Fragment 对象并将其添加到 container 中

    • 参数解析
      • containerViewGroup,即 ViewPager,用于将新创建的 Fragment 添加到这个容器中
      • position:表示当前页面的位置
  • adapter.destroyItem(ViewGroup container, int position, Object object):从 container 中移除并销毁指定位置的 Fragment 对象

    • 参数解析
      • containerViewGroup,即 ViewPager,用于从这个容器中移除 Fragment
      • position:表示要销毁的页面的位置
      • object:即 Fragment 对象
  • adapter.getItem(int position)返回指定位置的 Fragment 对象每次需要新的 Fragment 时,ViewPager 会调用这个方法

    • 参数解析
      • position:表示当前页面的位置
  • adapter.getCount()返回 Fragment 的总数量即 ViewPager 中页面的数量

使用环境与完整代码解析

  • FragmentPagerAdapter 主要用于 ViewPager 中管理和显示 Fragment。以下是一些典型的使用环境和场景

    经典的 Tab 界面

    • 使用了 TabLayoutViewPagerViewPager 允许用户通过左右滑动来切换页面,同时 TabLayout 提供了页签来快速跳转到特定页面。用户可以通过点击不同的 tab 或者左右滑动来切换页面

    • 代码示例MainActivity 中的 ViewPager 以及 MyPagerAdapter 的设置支持左右滑动

      • 创建主布局文件res/layout/activity_main.xml

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"/>
        
            <androidx.viewpager.widget.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/tabLayout"/>
        </RelativeLayout>
        
      • 创建fragment1布局文件res/layout/fragment_first.xml

        <?xml version="1.0" encoding="utf-8"?>
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This is the first tab"
                android:textSize="24sp"
                android:layout_gravity="center"/>
        </FrameLayout>
        
      • 创建fragment2布局文件res/layout/fragment_second.xml

        <?xml version="1.0" encoding="utf-8"?>
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This is the second tab"
                android:textSize="24sp"
                android:layout_gravity="center"/>
        </FrameLayout>
        
      • 创建fragment3布局文件res/layout/fragment_third.xml

        <?xml version="1.0" encoding="utf-8"?>
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="This is the third tab"
                android:textSize="24sp"
                android:layout_gravity="center"/>
        </FrameLayout>
        
      • 每个 Fragment 的实现类似,只需修改显示的内容

        • FirstFragment.java

          public class FirstFragment extends Fragment {
          
              @Override
              public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                  return inflater.inflate(R.layout.fragment_first, container, false);
              }
          }
          
        • SecondFragment.java

          public class SecondFragment extends Fragment {
          
              @Override
              public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                  return inflater.inflate(R.layout.fragment_second, container, false);
              }
          }
          
        • ThirdFragment.java

          public class ThirdFragment extends Fragment {
          
              @Override
              public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                  return inflater.inflate(R.layout.fragment_third, container, false);
              }
          }
          
      • 自定义FragmentPagerAdapter类MyPagerAdapter.java

        public class MyPagerAdapter extends FragmentPagerAdapter {
        
            public MyPagerAdapter(FragmentManager fm) {
                super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
            }
        
            @Override
            public Fragment getItem(int position) {
                // 根据位置返回不同的 Fragment
                switch (position) {
                    case 0:
                        return new FirstFragment();
                    case 1:
                        return new SecondFragment();
                    case 2:
                        return new ThirdFragment();
                    default:
                        return new FirstFragment();
                }
            }
        
            @Override
            public int getCount() {
                // 返回页数
                return 3;
            }
        
            @Override
            public CharSequence getPageTitle(int position) {
                // 返回每个 tab 的标题
                switch (position) {
                    case 0:
                        return "Tab 1";
                    case 1:
                        return "Tab 2";
                    case 2:
                        return "Tab 3";
                    default:
                        return null;
                }
            }
        }
        
      • 启动类

        public class MainActivity extends AppCompatActivity {
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                //加载活动的布局文件,这个布局文件通常包含 ViewPager 和其他可能的 UI 元素(如 TabLayout)
                setContentView(R.layout.activity_main);
        	
                //获取布局中的 ViewPager 和其他 UI 组件的引用,以便后续的操作和设置
                ViewPager viewPager = findViewById(R.id.viewPager);
                TabLayout tabLayout = findViewById(R.id.tabLayout);
        
                // 创建适配器
                MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager());
                //负责管理和提供 Fragment 的对象
                viewPager.setAdapter(adapter);
                // 将 TabLayout 绑定到 ViewPager
                tabLayout.setupWithViewPager(viewPager);
            }
        }
        

    带有动态内容的多页面界面

    • 使用了 ViewPager 来展示多个页面,每个页面展示不同的动态内容。用户可以通过左右滑动来浏览不同的页面

    • 代码示例MainActivity 中的 ViewPager 和 DynamicPagerAdapter 支持左右滑动

      • 创建主布局文件res/layout/activity_main.xml

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"/>
        
            <androidx.viewpager.widget.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/tabLayout"/>
        </RelativeLayout>
        
      • 创建fragment布局文件res/layout/fragment_dynamic.xml

        <?xml version="1.0" encoding="utf-8"?>
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="24sp"
                android:layout_gravity="center"/>
        </FrameLayout>
        
      • 自定义FragmentPagerAdapter类DynamicPagerAdapter.java

        public class DynamicPagerAdapter extends FragmentPagerAdapter {
        
            private List<String> dataList;
        
            public DynamicPagerAdapter(FragmentManager fm, List<String> data) {
                super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
                this.dataList = data;
            }
        
            @Override
            public Fragment getItem(int position) {
                // 获取每个 Fragment 的动态数据
                String data = dataList.get(position);
                return DynamicFragment.newInstance(data);
            }
        
            @Override
            public int getCount() {
                // 返回数据项的数量
                return dataList.size();
            }
        }
        
      • 自定义 Fragment 类DynamicFragment.java

        public class DynamicFragment extends Fragment {
        
            private static final String ARG_DATA = "data";
        
            // 创建新实例并传递数据
            public static DynamicFragment newInstance(String data) {
                DynamicFragment fragment = new DynamicFragment();
                Bundle args = new Bundle();
                args.putString(ARG_DATA, data);
                fragment.setArguments(args);
                return fragment;
            }
        
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment_dynamic, container, false);
                // 获取传递的数据并显示
                String data = getArguments().getString(ARG_DATA);
                TextView textView = view.findViewById(R.id.textView);
                textView.setText(data);
                return view;
            }
        }
        
      • 启动类

        public class MainActivity extends AppCompatActivity {
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                //加载活动的布局文件,这个布局文件通常包含 ViewPager 和其他可能的 UI 元素(如 TabLayout)
                setContentView(R.layout.activity_main);
        
                //获取布局中的 ViewPager 和其他 UI 组件的引用,以便后续的操作和设置
                ViewPager viewPager = findViewById(R.id.viewPager);
                // 模拟动态数据:提供数据源(例如 List<String>),并将数据传递给适配器,以便动态生成页面
                List<String> data = Arrays.asList("Page 1", "Page 2", "Page 3");
                // 创建适配器
                DynamicPagerAdapter adapter = new DynamicPagerAdapter(getSupportFragmentManager(), data);
                //负责管理和提供 Fragment 的对象
                viewPager.setAdapter(adapter);
            }
        }
        

    复杂的内容展示

    • 场景中同样使用了 ViewPager每个页面可能包含更复杂的 UI 组件和交互,但 ViewPager 依然支持左右滑动来切换不同的页面

    • 代码示例MainActivity 中的 ViewPager 和 ComplexPagerAdapter 支持左右滑动

      • 创建主布局文件res/layout/activity_main.xml

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        
            <com.google.android.material.tabs.TabLayout
                android:id="@+id/tabLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"/>
        
            <androidx.viewpager.widget.ViewPager
                android:id="@+id/viewPager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/tabLayout"/>
        </RelativeLayout>
        
      • 创建fragment布局文件res/layout/fragment_complex.xml

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="16dp">
        
            <TextView
                android:id="@+id/positionTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="24sp"/>
        
            <Button
                android:id="@+id/actionButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Click Me"
                android:layout_marginTop="16dp"/>
        </LinearLayout>
        
      • 自定义FragmentPagerAdapter类ComplexPagerAdapter.java

        public class ComplexPagerAdapter extends FragmentPagerAdapter {
        
            public ComplexPagerAdapter(FragmentManager fm) {
                super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
            }
        
            @Override
            public Fragment getItem(int position) {
                // 根据位置创建不同的 Fragment
                return ComplexFragment.newInstance(position);
            }
        
            @Override
            public int getCount() {
                // 返回页数
                return 5;
            }
        }
        
      • 自定义 Fragment 类ComplexFragment.java

        public class ComplexFragment extends Fragment {
        
            private static final String ARG_POSITION = "position";
        
            // 创建新实例并传递位置参数
            public static ComplexFragment newInstance(int position) {
                ComplexFragment fragment = new ComplexFragment();
                Bundle args = new Bundle();
                args.putInt(ARG_POSITION, position);
                fragment.setArguments(args);
                return fragment;
            }
        
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.fragment_complex, container, false);
                int position = getArguments().getInt(ARG_POSITION);
        
                // 初始化视图并处理复杂内容
                TextView positionTextView = view.findViewById(R.id.positionTextView);
                positionTextView.setText("Position: " + position);
        
                Button actionButton = view.findViewById(R.id.actionButton);
                actionButton.setOnClickListener(v -> {
                    // 处理按钮点击事件
                    Toast.makeText(getActivity(), "Button in position " + position + " clicked!", Toast.LENGTH_SHORT).show();
                });
        
                return view;
            }
        }
        
      • 启动类

        public class MainActivity extends AppCompatActivity {
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                //加载活动的布局文件,这个布局文件通常包含 ViewPager 和其他可能的 UI 元素(如 TabLayout)
                setContentView(R.layout.activity_main);
        		
                //获取布局中的 ViewPager 和其他 UI 组件的引用,以便后续的操作和设置
                ViewPager viewPager = findViewById(R.id.viewPager);
                // 创建适配器
                ComplexPagerAdapter adapter = new ComplexPagerAdapter(getSupportFragmentManager());
                //负责管理和提供 Fragment 的对象
                viewPager.setAdapter(adapter);
            }
        }
        

标签:FragmentPagerAdapter,return,Fragment,ViewPager,Adapter,public,int,position,适配器
From: https://www.cnblogs.com/ajunjava/p/18337667

相关文章

  • Android开发 - (适配器)Adapter类中RecyclerView.Adapter实现类详细解析
    简介RecyclerView的基础适配器,用于绑定数据和创建视图持有者具体作用RecyclerView.Adapter是Android中RecyclerView的适配器基类,负责将数据绑定到RecyclerView的子项视图上。它是RecyclerView的核心组件之一,用于处理数据集和视图之间的映射。具体来说,RecyclerVie......
  • 适配器模式
    适配器模式(AdapterPattern)将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作适配器继承适配对象,并实现适配目标所有的方法 国标接口(适配目标)publicinterfaceNationalStandard{voiduse()......
  • Android开发 - (适配器)Adapter类中SimpleAdapter实现类详细解析
    具体作用SimpleAdapter的主要作用是简化将数据源(如List<Map<String,Object>>)绑定到视图组件(如TextView、ImageView等)的过程。它可以根据指定的键将数据映射到指定的视图组件上,从而快速实现数据的展示参数、方法解析SimpleAdapter(Contextcontext,List<?extendsMap......
  • Android开发 - (适配器)Adapter类中BaseAdapter实现类详细解析
    具体作用BaseAdapter是Android开发中一个非常重要的Adapter(适配器)基类。它提供了创建自定义适配器的基本实现,使开发者可以根据具体需求创建适用于不同视图(如ListView、GridView)的数据适配器。以下是BaseAdapter的主要作用:提供基本接口实现BaseAdapter实现了ListAd......
  • 设计模式-适配器模式( Adapter Pattern)
    设计模式-适配器模式(AdapterPattern)  概要   记忆关键词:转换,兼容接口  定义:将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。  分析:在适配器模式中,Cilent调用Adapter以获得相应功能,Adapter扩......
  • Android开发 - (适配器)Adapter类中CursorAdapter实现类详细解析
    作用将Cursor对象中的数据与AdapterView组件(如ListView、GridView等)进行绑定。以下是CursorAdapter的主要作用:1.数据源绑定数据源连接:CursorAdapter通过Cursor对象作为数据源,实现了从数据库或其他数据源(如ContentResolver查询结果)中读取数据的功能。这使得开发者能够轻松地......
  • Android开发 - (适配器)Adapter类中ArrayAdapter实现类详细解析
    作用将数组数据映射到UI组件(如ListView、Spinner等)上的角色。它是BaseAdapter的一个子类,专门用于处理简单的数据集合,如数组或列表。ArrayAdapter简化了数据到视图映射的过程,使得开发者能够以更少的代码实现数据的展示。它的主要作用为以下几点:数据绑定:它能够将一组数据......
  • 设计模式:代理、装饰和适配器模式的区别
    结构对比讲实话,博主当初学习完整设计模式时,这三种设计模式单独摘哪一种都是十分清晰和明确的,但是随着模式种类的增加,在实际使用的时候竟然会出现恍惚,例如读开源代码时,遇到不以模式命名规范的代码时,一时难以说清具体是使用的这三种里的哪一种。之所以会出现混淆的原因是,三种模式......
  • ComfyUI插件:IPAdapter_plus(新版)节点
    ComfyUI插件:IPAdapter_plus(新版)节点前言:学习ComfyUI是一场持久战,而IPAdapter_plus是常用且便捷有效的风格迁移模型,可以通过提供参考图像去进行图像的生成,比如风格迁移,风格融合,人物脸部模拟等各种工作,请大家重点关注本篇内容,深刻理解节点用法!!祝大家学习顺利,早日成为ComfyUI的高手......
  • 设计模式总结:适配器、桥接、组合和迭代器模式
    在之前的对话中,我们讨论了五种常见的Java设计模式:单例、工厂、策略、装饰器和观察者模式。现在,让我们继续探索其他四种设计模式:适配器、桥接、组合和迭代器模式。适配器模式概念:适配器模式是一种结构型设计模式,用于将一个类的接口转换为另一个类期望的接口。适配器模式......