ViewPager+Fragmet的使用及适配器的选择

本文详细解析了ViewPager结合Fragment实现页面滑动的机制,对比了FragmentPagerAdapter和FragmentStatePagerAdapter的区别,阐述了它们在不同场景下的应用。通过示例代码展示了适配器和Fragment的创建过程,以及在切换页面时Fragment生命周期的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ViewPager+Fragment的组合主要是为了实现页面滑动功能,并且在开发当中使用的也比较频繁,特此记录一下。

  • 适配器的选择
    该组合有两个专门用于它们的适配器:FragmentPagerAdapter和FragmentStatePagerAdapter都是继承自PagerAdapter,两者的区别在于前者会保存所有浏览过的Fragment,不会把Fragment的View也保存到内存中,当然为了保证滑动的的流畅当前页面和左右Fragment的View会被保存到内存当中,其余的都会调用onDestroyView方法销毁。后者的区别就是当Fragment对用户不可见的时候,整个Fragment会被销毁(当然,为了保证滑动时流畅,和前者一样,左右两个页面的Fragment会被保留),而不像FragmentPagerAdapter那样,只是销毁Fragment中的View。
    使用场景:
    当页面较少的时候使用FragmentPagerAdapter不然使用FragmentStatePagerAdapter吧。

  • 创建适配器

package com.example.dadao.dadaorobot.adapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import com.example.dadao.dadaorobot.until.Logger;

import java.util.List;

public class XFragmentPageAdapter extends FragmentPagerAdapter {
    FragmentManager fragmentManager;
    List<Fragment> mList;

    public XFragmentPageAdapter(FragmentManager fm, List<Fragment>list) {
        super(fm);
        this.mList=list;
    }

    @Override
    public Fragment getItem(int i) {
        Logger.i("getItem当生成Fragment时调用?");
        return mList.get(i);
    }

    @Override
    public int getCount() {
        return mList.size();
    }
}

  • 创建Fragment
package com.example.dadao.dadaorobot.fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.dadao.dadaorobot.R;
import com.example.dadao.dadaorobot.until.Logger;

public class OneFragment extends Fragment {

    public OneFragment() {

    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Logger.d("onCreate:------------Fragment创建");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       View view=inflater.inflate(R.layout.fragment_one, container, false);
       Logger.d("onCreateView:------------------View创建");
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        Logger.d("onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Logger.d("onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
    Logger.d("onStop");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Logger.d("onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Logger.d("onDestroy");
    }
}

再创建两个这样的Fragment

  • 在Activity中的使用
 /**
     *初始化ViewPager
     */
    public void initViewPageFragment() {
        fragmentList = new ArrayList<>();
        fragmentList.add(new OneFragment());
        fragmentList.add(new TwoFragment());
        fragmentList.add(new ThreeFragment());
        xFragmentPageAdapter = new XFragmentPageAdapter(fragmentManager, fragmentList);
        viewPage.setAdapter(xFragmentPageAdapter);
        viewPage.setCurrentItem(0);
        viewPage.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {
              //  Logger.e("onPageScrolled:" + i + "," + v + "," + i1);

            }

            @Override
            public void onPageSelected(int i) {
                Logger.e("当前页码:" + i);

            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

    }

最后分析一下Fragment在不同情况下的生命周期

  • 当前界面为OneFragment时
2018-11-22 15:24:16.073 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 21 | onCreate()]: onCreate:------------Fragment创建
2018-11-22 15:24:16.073 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 22 | onCreate()]: onCreate:-----------Fragment创建
2018-11-22 15:24:16.078 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 28 | onCreateView()]: onCreateView:------------------View创建
2018-11-22 15:24:16.081 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 35 | onStart()]: onStart
2018-11-22 15:24:16.082 30885-30885/com.example.dadao.dadaorobot D/[OneFragment.java | 42 | onResume()]: onResume
2018-11-22 15:24:16.082 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 28 | onCreateView()]: onCreateView:-----------View创建
2018-11-22 15:24:16.087 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 35 | onStart()]: onStart
2018-11-22 15:24:16.087 30885-30885/com.example.dadao.dadaorobot D/[TwoFragment.java | 42 | onResume()]: onResume

由Log可见此时不仅会创建OneFragment的View同时还会创建TwoFragment和它的View

  • 当界面为TwoFragment时
2018-11-22 17:30:08.421 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 22 | onCreate()]: onCreate:--------------Fragment创建
2018-11-22 17:30:08.423 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 28 | onCreateView()]: onCreateView:----------View创建
2018-11-22 17:30:08.443 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 35 | onStart()]: onStart
2018-11-22 17:30:08.443 8205-8205/com.example.dadao.dadaorobot D/[ThreeFragment.java | 42 | onResume()]: onResume

可见适配器会自动创建当前界面左右的Fragment和View并保存

  • 当界面为ThreeFragment时
2018-11-22 17:33:03.016 8205-8205/com.example.dadao.dadaorobot D/[OneFragment.java | 48 | onPause()]: onPause
2018-11-22 17:33:03.017 8205-8205/com.example.dadao.dadaorobot D/[OneFragment.java | 54 | onStop()]: onStop
2018-11-22 17:33:03.018 8205-8205/com.example.dadao.dadaorobot D/[OneFragment.java | 60 | onDestroyView()]: onDestroyView

会销毁不是与ThreeFragment相邻的OneFragment的View,但是不会销毁Fragment.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值