博客
关于我
Android 联合ViewPager 与 Fragment
阅读量:363 次
发布时间:2019-03-04

本文共 5608 字,大约阅读时间需要 18 分钟。

Fragment与ViewPager适配器

FragmentPageAdapter与FragmentStatePagerAdapter

在Android开发中,Fragment与ViewPager的结合使用是非常常见的操作。为了实现滑动效果并为ViewPager填充Fragment,开发者需要选择合适的适配器。本文将详细介绍FragmentPageAdapter和FragmentStatePagerAdapter的区别及其使用方法。

FragmentPageAdapter

FragmentPageAdapter是一种简单的Fragment适配器,主要用于实现Fragment的滑动效果。其核心思想是使用Fragment来填充ViewPager。这种适配器适用于页面数量较少的情况,因为它会将每一个Fragment保存在内存中,避免了频繁的Fragment销毁和重新创建,能够提供较好的用户体验。

然而,对于Fragment数量较多的情况,FragmentPageAdapter的内存消耗较高,可能导致性能问题。因此,在Fragment数量较多时,建议使用FragmentStatePagerAdapter。

FragmentStatePagerAdapter

FragmentStatePagerAdapter是一种优化版本的Fragment适配器,同样用于实现Fragment的滑动效果和填充ViewPager。与FragmentPageAdapter相比,它适用于页面数量较多的情况,能够更有效地管理Fragment的生命周期,释放不必要的内存资源。

创建FragmentPageAdapter适配器

要创建一个FragmentPageAdapter,需要实现以下关键方法:

  • 获取页面方法:通过重写getItem方法返回对应的Fragment。
  • 获取页面数量方法:通过重写getCount方法返回Fragment的总数。
  • 以下是一个典型的FragmentPageAdapter实现示例:

    import androidx.annotation.NonNull;
    import androidx.fragment.app.Fragment;
    import androidx.fragment.app.FragmentManager;
    import androidx.fragment.app.FragmentPagerAdapter;
    import java.util.List;
    public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
    private List
    fragmentList;
    public MyFragmentPagerAdapter(@NonNull FragmentManager fm, List
    listFragment) {
    super(fm);
    this.fragmentList = listFragment;
    }
    @NonNull
    @Override
    public Fragment getItem(int position) {
    return fragmentList.get(position);
    }
    @Override
    public int getCount() {
    return fragmentList.size();
    }
    }

    Fragment切换与ViewPager滑动监听

    在实际开发中,除了设置Fragment,还需要实现ViewPager的滑动监听,以便根据用户滑动位置调整UI状态。

    以下是一个简单的PageChangeListener实现示例:

    public class MyPageChangeListener implements ViewPager.OnPageChangeListener {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    // 滑动时执行的逻辑
    }
    @Override
    public void onPageSelected(int position) {
    // 选中页面时执行的逻辑
    switch (position) {
    case 0:
    tab1.setBackgroundColor(Color.RED);
    tab2.setBackgroundColor(Color.WHITE);
    tab3.setBackgroundColor(Color.WHITE);
    break;
    case 1:
    tab1.setBackgroundColor(Color.WHITE);
    tab2.setBackgroundColor(Color.RED);
    tab3.setBackgroundColor(Color.WHITE);
    break;
    case 2:
    tab1.setBackgroundColor(Color.WHITE);
    tab2.setBackgroundColor(Color.WHITE);
    tab3.setBackgroundColor(Color.RED);
    break;
    }
    }
    @Override
    public void onPageScrollStateChanged(int state) {
    // 滑动状态改变时执行的逻辑
    }
    }

    UI部分代码

    在实际开发中,UI布局和交互逻辑需要进行良好的设计和实现。以下是一个典型的MainActivity实现示例:

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.fragment.app.Fragment;
    import androidx.viewpager.widget.ViewPager;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    import java.util.ArrayList;
    import java.util.List;
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tab1, tab2, tab3;
    private ViewPager viewPager;
    private List
    fragmentList;
    private MyFragmentPagerAdapter myFragmentPagerAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initUI();
    initTab();
    }
    private void initUI() {
    tab1 = findViewById(R.id.tab1);
    tab2 = findViewById(R.id.tab2);
    tab3 = findViewById(R.id.tab3);
    tab1.setOnClickListener(this);
    tab2.setOnClickListener(this);
    tab3.setOnClickListener(this);
    viewPager = findViewById(R.id.myViewPager);
    }
    private void initTab() {
    FragmentOne fragmentOne = new FragmentOne();
    FragmentTwo fragmentTwo = new FragmentTwo();
    FragmentThree fragmentThree = new FragmentThree();
    fragmentList = new ArrayList<>();
    fragmentList.add(fragmentOne);
    fragmentList.add(fragmentTwo);
    fragmentList.add(fragmentThree);
    myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList);
    viewPager.setAdapter(myFragmentPagerAdapter);
    viewPager.addOnPageChangeListener(new MyPageChangeListener());
    showFragment(0);
    }
    private void showFragment(int position) {
    viewPager.setCurrentItem(position);
    switch (position) {
    case 0:
    tab1.setBackgroundColor(Color.RED);
    tab2.setBackgroundColor(Color.WHITE);
    tab3.setBackgroundColor(Color.WHITE);
    break;
    case 1:
    tab1.setBackgroundColor(Color.WHITE);
    tab2.setBackgroundColor(Color.RED);
    tab3.setBackgroundColor(Color.WHITE);
    break;
    case 2:
    tab1.setBackgroundColor(Color.WHITE);
    tab2.setBackgroundColor(Color.WHITE);
    tab3.setBackgroundColor(Color.RED);
    break;
    }
    }
    @Override
    public void onClick(View v) {
    if (v.getId() == R.id.tab1) {
    showFragment(0);
    } else if (v.getId() == R.id.tab2) {
    showFragment(1);
    } else if (v.getId() == R.id.tab3) {
    showFragment(2);
    }
    }
    }

    总结

    通过以上内容,开发者可以了解如何使用Fragment与ViewPager实现多页面应用。在实际开发中,根据项目需求选择合适的FragmentPagerAdapter类型,并结合ViewPager和PageChangeListener实现页面切换和UI状态管理。

    转载地址:http://tzyg.baihongyu.com/

    你可能感兴趣的文章
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMCU(五):STM32F103时钟树初始化分析
    查看>>
    OpenMCU(四):STM32F103启动汇编代码分析
    查看>>
    OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
    查看>>
    OpenMMLab | AI玩家已上线!和InternLM解锁“谁是卧底”新玩法
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 不是吧?这么好用的开源标注工具,竟然还有人不知道…
    查看>>
    OpenMMLab | 如何解决大模型长距离依赖问题?HiPPO 技术深度解析
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenMP 线程互斥锁
    查看>>
    OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
    查看>>