ViewPager中的FragmentPagerAdapter,FragmentStatePagerAdapter

PagerAdapter,FragmentPagerAdapter,FragmentStatePagerAdapter原理分析,notifyDataSetChanged如何更新Fragment? 水平显示Fragment分页在FragmentPagerAdapter和FragmentStatePagerAdapter使用如何选择? FragmentPagerAdapater FragmentPagerAdapter继承自PagerAdapter类,它将每个页面使用一个Fragment,只要用户能够返回到该页面,该Fragment就会一直保存在FragmentManager中,子类只需要实现getItem()和getCount()就可以实现一个可以工作的Adapter。 FragmentPager 阅读详情

在开发中ViewPager+fragment,包括缓存pager或者fragment中一些问题,什么时候该缓存销毁page,什么时候缓存销毁fragment问题
FragmentPagerAdapter,FragmentStatePagerAdapter的区别和适用场景

FragmentPagerAdapter

1、通过offscreenPageLimit来控制page container的cache数量 n*2+1;

2、当加载的page超出cache count会用FragmentManager来释放fragment

3、被释放的fragment实际上不会被完全回收,因为没有调用onDestory(),当再次回到这个page时也没有调用onCreate();

4、当fragment被显示在屏幕上时,setUserVisibleHint为true,不显示时为false.

适用于:
page是固定的,并且数量比较少,因为fragment不会被完全回收

FragmentStatePagerAdapter

其他三点都一样,不同的是
被释放的fragment会被完全回收,调用了onDestory()的方法;

适用于:
比较多的fragment,保证回收,清理内存

1、首先明确Fragment的生命周期

如果用ViewPager+fragment,首先应该明确fragment的生命周期,这个fragment什么时候开始创建,什么时候创建完成,什么时候创建view,什么时候可以加载数据。
这里写图片描述
几个重要容易模糊的生命周期
1、onAttach() 当一个fragment第一次绑定到它所属的activity中

 /**
     * Called when a fragment is first attached to its activity.
     * {@link #onCreate(Bundle)} will be called after this.
     * <p>Deprecated. See {@link #onAttach(Context)}.
     */
    @Deprecated
    public void onAttach(Activity activity) {
        mCalled = true;
    }

2、onCreate()它所属的activity正在创建中,并没有创建完成

 /**
     * Called to do initial creation of a fragment.  This is called after
     * {@link #onAttach(Activity)} and before
     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
     * 
     * <p>Note that this can be called while the fragment's activity is
     * still in the process of being created.  As such, you can not rely
     * on things like the activity's content view hierarchy being initialized
     * at this point.  If you want to do work once the activity itself is
     * created, see {@link #onActivityCreated(Bundle)}.
     * 
     * @param savedInstanceState If the fragment is being re-created from
     * a previous saved state, this is the state.
     */
    public void onCreate(@Nullable Bundle savedInstanceState) {
        mCalled = true;
    }

3、onCreateView():可以把fragment的布局填充到view中,返回fragment的UI布局。

 /**
     * Called to have the fragment instantiate its user interface view.
     * This is optional, and non-graphical fragments can return null (which
     * is the default implementation).  This will be called between
     * {@link #onCreate(Bundle)} and {@link #onActivityCreated(Bundle)}.
     * 
     * <p>If you return a View from here, you will later be called in
     * {@link #onDestroyView} when the view is being released.
     * 
     * @param inflater The LayoutInflater object that can be used to inflate
     * any views in the fragment,
     * @param container If non-null, this is the parent view that the fragment's
     * UI should be attached to.  The fragment should not add the view itself,
     * but this can be used to generate the LayoutParams of the view.
     * @param savedInstanceState If non-null, this fragment is being re-constructed
     * from a previous saved state as given here.
     * 
     * @return Return the View for the fragment's UI, or null.
     */
    @Nullable
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
        return null;
    }

4、onActivityCreated():这时候activity创建完成,并且fragment布局已经填充进去。

  /**
     * Called when the fragment's activity has been created and this
     * fragment's view hierarchy instantiated.  It can be used to do final
     * initialization once these pieces are in place, such as retrieving
     * views or restoring state.  It is also useful for fragments that use
     * {@link #setRetainInstance(boolean)} to retain their instance,
     * as this callback tells the fragment when it is fully associated with
     * the new activity instance.  This is called after {@link #onCreateView}
     * and before {@link #onViewStateRestored(Bundle)}.
     *
     * @param savedInstanceState If the fragment is being re-created from
     * a previous saved state, this is the state.
     */
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        mCalled = true;
    }

5、onDestroyView:销毁当前的view也就是填充的布局

 /**
     * Called when the view previously created by {@link #onCreateView} has
     * been detached from the fragment.  The next time the fragment needs
     * to be displayed, a new view will be created.  This is called
     * after {@link #onStop()} and before {@link #onDestroy()}.  It is called
     * <em>regardless</em> of whether {@link #onCreateView} returned a
     * non-null view.  Internally it is called after the view's state has
     * been saved but before it has been removed from its parent.
     */
    public void onDestroyView() {
        mCalled = true;
    }

6、onDestroy():销毁当前的fragment

  /**
     * Called when the fragment is no longer in use.  This is called
     * after {@link #onStop()} and before {@link #onDetach()}.
     */
    public void onDestroy() {
        mCalled = true;
        //Log.v("foo", "onDestroy: mCheckedForLoaderManager=" + mCheckedForLoaderManager
        //        + " mLoaderManager=" + mLoaderManager);
        if (!mCheckedForLoaderManager) {
            mCheckedForLoaderManager = true;
            mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
        }
        if (mLoaderManager != null) {
            mLoaderManager.doDestroy();
        }
    }

2、ViewPager中的适配器使用FragmentPagerAdapter

package com.example.yu.viewpager;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;

import com.example.yu.baseactivity.R;
import com.example.yu.viewpager.fragment.Fragment1;
import com.example.yu.viewpager.fragment.Fragment2;
import com.example.yu.viewpager.fragment.Fragment3;
import com.example.yu.viewpager.fragment.Fragment4;
import com.example.yu.viewpager.fragment.Fragment5;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends FragmentActivity {

    private ViewPager viewPager;

    private MyFragemtAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        List<Fragment> fragments = new ArrayList<Fragment>();

        fragments.add(new Fragment1());
        fragments.add(new Fragment2());
        fragments.add(new Fragment3());
        fragments.add(new Fragment4());
        fragments.add(new Fragment5());
        adapter = new MyFragemtAdapter(getSupportFragmentManager(), fragments);
        //设置缓存page的个数 2*n+1;
        viewPager.setOffscreenPageLimit(1);

        viewPager.setAdapter(adapter);
    }

    class MyFragemtAdapter extends FragmentPagerAdapter {
        private List<Fragment> mFragments;

        public MyFragemtAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            mFragments = fragments;
        }

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

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

Fragment1示例代码如下(其他四个也都一样)

package com.example.yu.viewpager.fragment;

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

import com.example.yu.baseactivity.R;

/**
 * Created by yu on 2016/6/12.
 */
public class Fragment1 extends Fragment {
    public static final String TAG = "Fragment1";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment1, container, false);
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.i(TAG, "fragment is onDestroyView()");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "fragment is onDestroy()");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "fragment is onCreate()");
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i(TAG, "fragment is onActivityCreated()");
    }
}

这里写图片描述

3、ViewPager中的适配器使用FragmentStatePagerAdapter

其他代码都不动,只修改适配器类型为FragmentStatePagerAdapter

 class MyFragemtAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> mFragments;

        public MyFragemtAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            mFragments = fragments;
        }

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

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

从Log日志分析
这里写图片描述

FragmentPagerAdapter与FragmentStatePagerAdapter那些秘密的事 FragmentPagerAdapter与FragmentStatePagerAdapter那些秘密的事 当google提出了viewpager+fragment的组合来开发后,这种组合带来的良好的用户体验到现在一直都受到市场的青睐。但是对于开发者来说,我们在选取viewpager+fragment的组合模式开发的时候到底如何选取呢。。。。。 立即下载

相关推荐

Android ViewPager 适配器 FragmentStatePagerAdapte

Android ViewPager 适配器 FragmentStatePagerAdapte

深入分析FragmentPagerAdapter和FragmentStatePagerAdapter

最近遇到比较奇怪的bug,TableLayout+ViewPager实现点击顶部tab切换viewpager视图。但是在Viewpager设置dapter时,最开始设置的是FragmentPagerAdapter,会导致tab切换后FragmentPagerAdapter内的视图未刷新(与上一个tab内容重复或展示成空白,展示成空白一般出现在页面重启后不能完成刷新成功)。替换成FragmentStatePagerAdapter或者FragmentStateAdapter,便解决了这一问题。这其实是个比较常见

qq_31398785的博客 3110

3DGS 2025实战指南:从安装到训练全流程解析

本文提供了3D Gaussian Splatting (3DGS) 从零开始的完整实战指南。详细解析了使用gsplat库进行环境配置、依赖安装(包括pycolmap和fused-ssim)、数据准备与COLMAP处理、核心训练流程及参数调优,并探讨了2025年3DGS在动态场景、可控编辑等领域的最新进展,帮助开发者快速掌握这一前沿3D重建技术。

b3n4m5q6w7的博客 359

FragmentPagerAdapter和FragmentStatePagerAdapter

在Fragment和ViewPager结合使用的时候。会用到PagerAdapter作为ViewPager的适配器。通常在实现ViewPager的时候,我们需要自己定义ViewPager,而在Fragment和ViewPager结合使用的时候。官方为我们提供了两个实现类FragmentPagerAdapter和FragmentStatePagerAdapter来帮助我们更快的实现效果。 1.官方...

ScottePerk的博客 547

草莓成熟度与叶片病虫害智能检测数据集应用全解析

本文深入解析草莓成熟度与叶片病虫害智能检测数据集的应用价值,涵盖从绿草莓到红果转色的完整成熟周期及白粉病、炭疽病等7种病害的精准识别。通过实战案例展示如何提升病害识别率至94%,并介绍数据集的科研价值,包括跨品种迁移学习和多模态数据融合技术。

weixin_28366353的博客 274

绝缘检测是什么? 绝缘检测原理 绝缘检测检测的是什么?那个量?电压?电流?电阻?

绝缘电阻是电气设备和电气线路最基本的绝缘指标。对于低压电气装置的交接试验,常温下电动机、配电设备和配电线路的绝缘电阻不应低于0.5MΩ(对于运行中的设备和线路,绝缘电阻不应低于1MΩ/kV)。 绝缘电阻的正确测量方法 现代生活日新月异,人们一刻也离不开电。在用电过程中就存在着用电安全问题,在电器设备中,例如电机、电缆、家用电器等。 影响因素 环境温湿度 一般材料的绝缘电阻值随环境温湿度的升高而减小。相对而言,表面电阻(率)对环境湿度比较敏感,而体电阻(率)则对温度较为敏感。 湿度增加,表面泄漏增大,导体电导

dianqicyuyan的博客 2万+

android viewpager fragment 生命周期,Android ViewPager中Fragment的生命周期&FragmentPageAdapter与FragmentStatePag...

首先,我们创建一个Activity和一个Fragment,并在Fragment的各个生命周期打好日志,并把Fragments丢进Viewpager,这里我们往Viewpager里丢了3个Fragment,够用了。同时设置Viewpager.adapter = FragmentPagerAdapter0.刚打开Avtivityviewpager刚进入时刻viewpager刚进入时刻:viewpage...

weixin_39959192的博客 633

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 440

ViewPager,PagerAdapter,FragmentPagerAdapter,FragmentStatePagerAdapter的API介绍翻译

ViewPager 类:public class ViewPager  继承自 ViewGroup  包中的位置:android.support.v4.view.ViewPager 定义:布局管理器允许用户左滑右滑含有数据的pages. 使用:只需要提供一个PagerAdapter 的实现来产生视图显示的pages. ViewPager 最常结合 Fragment使

欸奥维 2023

Jasypt 开源加密库使用教程

Jasypt 加密框架概述 1、Jasypt Spring Boot 为 spring boot 应用程序中的属性源提供加密支持,出于安全考虑,Spring boot 配置文件中的敏感信息通常需要对它进行加密/脱敏处理,尽量不使用明文,要实现这一点,办法有很多,自己手动对敏感信息进行加解密也是可以的。 2、有需求就有人奉献,Jasypt 开源安全框架就是专门用于处理 Spring boot 属性加密的,在配置文件中直接配置密文,然后应用启动的时候,Jasypt 会自动将密码解密成明文供程序使用。 3、

蚩尤后裔-汪茂雄 3万+

【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose

【时序列】时序列数据如何一步步分解成趋势(trend)季节性(seasonality)和误差(residual)- 详细理解python sm.tsa.seasonal_decompose 在做时序列分析的时候,好多教程都告诉你要把时序列分解成趋势,季节性,残差,然后画图看一下有没有趋势变化,有没有季节性。像这样: import statsmodels.api as sm decomposition = sm.tsa.seasonal_decompose(train['Count'] ,model='add

weixin_47442572的博客 2万+

Android FragmentPagerAdapter vs FragmentStatePagerAdapter

使用ViewPager 切换Fragment中,适配器 FragmentPagerAdapter 和 FragmentStatePagerAdapter的区别: To develop an app in Andorid with sliding views, a variation of PagerAdapter class along with ViewPager class is

GG之家 2024

Prompt Learning 简介

• Prompt Learning 可以将所有的任务归一化预训练语言模型的任务• 避免了预训练和fine-tuning 之间的gap,几乎所有 NLP 任务都可以直接使用,不需要训练数据。• 在少样本的数据集上,能取得超过fine-tuning的效果。• 使得所有的任务在方法上变得一致。

jxsdq的博客 1万+

ViewPager源码解析之FragmentPagerAdapter和FragmentStatePagerAdapter

从FragmentPagerAdapter说起我们经常使用的是ViewPager和Fragment的配合。在第一篇中我们提到了如果ViewPager使用了FragmentPagerAdapter,ViewPager添加View的时机是在onMeasure()的populate()中。//ViewPager.java @Override protected void onMeasure(int

chengkun_123的博客 5146

LangGraph 实战教程:搭建一个智能办公多Agent协作平台

只存储必要的信息:不要把所有的原始数据都存储在状态中,比如销售数据可以存储在数据库或向量数据库中,状态中只存储数据的 ID 或摘要。使用类型提示:避免类型错误,提高代码的可维护性。支持增量更新:LangGraph 默认支持状态的增量更新(通过reduce函数),比如messages列表可以通过追加新消息的方式更新,而不是每次都重新创建整个列表。Normal Edge 的定义非常简单,只需要在StateGraph对象(稍后会详细讲解)上调用add_edge# 创建一个 StateGraph 对象。

SuperAGI2025 221

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android FragmentPagerAdapter与FragmentStatePagerAdapter

FragmentPagerAdapter是Android-support-v4支持包里面出现的一个新的适配器,继承自PagerAdapter,是专门用来给支持包中出现的ViewPager进行数据适配的。 PagerAdapter在之前的文章中进行过简单的介绍,不记得怎么使用的可以先去看一下。 FragmentPagerAdapter,见名知意,这个适配器就是用来实现Fragment在ViewP

BridgeGeorge 821

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

FragmentPagerAdapter与FragmentStatePagerAdapter使用详解与区别

转载请注明出处:http://blog.youkuaiyun.com/zhaokaiqiang1992FragmentPagerAdapter是Android-support-v4支持包里面出现的一个新的适配器,继承自PagerAdapter,是专门用来给支持包中出现的ViewPager进行数据适配的。 PagerAdapter在之前的文章中进行过简单的介绍,不记得怎么使用的可以先去看一下。

Xs15073722800的博客 549

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FragmentPagerAdapter与FragmentStatePagerAdapter差异

简介 平常使用的FragmentPagerAdapter和FragmentStatePagerAdapter来自android.support.v4.app包用来构建ViewPager。 FragmentPagerAdapter更多的用于少量界面的ViewPager,比如Tab。划过的fragment会保存在内存中,尽管已经划过。而FragmentStatePagerAdapter和ListV

不只是写代码的程序员 1万+

PagerAdapter和FragmentPagerAdapter和FragmentStatePagerAdapter区别

转自:http://blog.youkuaiyun.com/dreamzml/article/details/9951577 ViewPager ViewPager 如其名所述,是负责翻页的一个 View。准确说是一个 ViewGroup,包含多个 View 页,在手指横向滑动屏幕时,其负责对 View 进行切换。为了生成这些 View 页,需要提供一个 PagerAdapter 

MR_HJY的博客 294

ViewPager与ViewPager2的Adapter对比

目录1. ViewPagerAdapter与其两个子类FragmentPagerAdapter、FragmentStatePagerAdapter1.1. ViewPagerAdapter重要方法剖析a. instantiateItem(ViewGroup container, int position)b. setPrimaryItem(ViewGroup container, int position, Object object)c. startUpdate(@NonNull View contain

weixin_40888127的博客 4660

Android ViewPager使用

Android ViewPager使用ViewPager是Android的一个UI组件,用于视图切换,我们可以往里面填充多个View,需要用到适配器。 PagerAdapter,数据源:List<View> FragmentPagerAdapter,数据源:List<Fragment> FragmentStatePagerAdapter,数据源:List<Fragment> 分析适配器: Pager

fjnu_se的博客 296

【Android】ViewPager

ViewPager是android扩展包v4包中的类,这个类可以让用户左右切换当前的view,用于允许用户在几个页面(或称为碎片)之间左右滑动切换。它通常用于创建像画廊或轮播图那样的用户体验。1)ViewPager类直接继承了ViewGroup类,所有它是一个容器类,可以在其中添加其他的view类。2)ViewPager类需要一个PagerAdapter适配器类给它提供数据。

2303_79296612的博客 2944

Android入门--ViewPager使用总结

ViewPager,是在Android3.0之后新增的API,可以用于导航栏,页面切换等控件,其主要功能是使视图可以左右滑动,使用时注意需要导入android-support-v4.jar包,如果创建的项目是3.0之后的,系统会自动导包,就不需要费心。当然,如果遇到导包问题,也不要着急,下面是解决办法:先检查项目中是否存在android-support-v4.jar包,如果不存在,就检查sdk中是否

classTC的博客 1582

FragmentPagerAdapter——ViewPager中添加fragment

FragmentPagerAdapter是PagerAdapter中的其中一种实现。它将每一个页面表示为一个 Fragment,并且每一个Fragment都将会保存到fragment manager当中。而且,当用户没可能再次回到页面的时候,fragment manager才会将这个Fragment销毁。这种pager十分适用于有一些静态fragment,例如一组tabs,的时候使用。每个页面对应的

mimi5821741的专栏 665

android中viewpager+fragment,ViewPager和Fragment一篇就够了

ViewPager显示多Fragment使用问题前言:每当使用ViewPager时,对于选用什么适配器,缓存多少页面,是否需要懒加载以及Fragment的数据刷新经常会有些疑问,网络上的答案很多,但是很少有一篇能够对一些疑问进行总结,本文主要在于记录,方便日后查看。1.FragmentPagerAdapter和FragmentPagerStateAdapter的区别,使用场景setOffScree...

weixin_39635648的博客 931

FragmentPagerAdapter与FragmentStatePagerAdapter区别

说明:在使用viewpager时候,发现有不同的适配器,并且适用于不同的情景。 介绍: FragmentPagerAdapter是android-support-v4支持包里面出现的一个新的适配器,继承自PagerAdapter,是专门用来给支持包中出现的ViewPager进行数据适配的。 PagerAdapter在之前的文章中进行过简单的介绍,不记得怎么使用的可以先去看一下。

437
上一篇: android 错误日志打印到本地
下一篇: ToolBar的使用
android_xiaogang
博客等级 码龄12年 89粉丝 142原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值