关于fragment+viewpager的优化

转载请加入链接,谢谢:http://blog.csdn.net/u013173289/article/details/44002371

上次写了一个问答项目,用的fragment+viewpager架构,后来发现,划了几次之后,再划回来,会重新加载布局,重新获取数据,这样整个程序和卡,并且占用太多的网络资源。

当时的解决办法是,自己重写view,用最基本的Basepageradapder,算是不是很优雅的解决了问题。

当时知道是重新调用onCreateView方法原因,但是没有好的解决办法,现在知道了,这里记载一下。

我实验了viewpager加载四个fragment:

第一次进入的时候:

<span style="font-size:18px;">03-01 13:50:16.151  22667-22667/com.graypn.modelproject I/onCreate1﹕ onCreate
03-01 13:50:16.151  22667-22667/com.graypn.modelproject I/onCreateView1﹕ onCreateView
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onActivityCreated1﹕ onActivityCreated
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onCreate2﹕ onCreate
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onCreateView2﹕ onCreateView
03-01 13:50:16.161  22667-22667/com.graypn.modelproject I/onActivityCreated2﹕ onActivityCreated</span>

往右滑动到第二个界面:

<span style="font-size:18px;">03-01 13:51:22.391  22667-22667/com.graypn.modelproject I/onCreate3﹕ onCreate
03-01 13:51:22.391  22667-22667/com.graypn.modelproject I/onCreateView3﹕ onCreateView
03-01 13:51:22.401  22667-22667/com.graypn.modelproject I/onActivityCreated3﹕ onActivityCreated</span>

往右滑动到第三个界面:

03-01 13:55:24.351  24165-24165/com.graypn.modelproject I/onDestroyView1﹕ onDestroyView
03-01 13:55:24.351  24165-24165/com.graypn.modelproject I/onCreate4﹕ onCreate
03-01 13:55:24.351  24165-24165/com.graypn.modelproject I/onCreateView4﹕ onCreateView
03-01 13:55:24.361  24165-24165/com.graypn.modelproject I/onActivityCreated4﹕ onActivityCreated

往右滑动到第四个界面:

03-01 13:56:22.021  24165-24165/com.graypn.modelproject I/onDestroyView2﹕ onDestroyView

往左划到第三个界面:

03-01 13:58:09.541  24165-24165/com.graypn.modelproject I/onCreateView2﹕ onCreateView
03-01 13:58:09.541  24165-24165/com.graypn.modelproject I/onActivityCreated2﹕ onActivityCreated

结论:viewpager会加载和当前页面相连的两个fragment,会销毁相邻第三个页面的view,再次调用是会重新oncreateview和onactivityreate。

我们需要优化自己的fragment,如下时我优化后的类:

<span style="font-size:18px;">/**
 * 提供了fragment的封装后基类,提供context给子类使用
 *
 * @author Graypn
 */
public abstract class BaseFragment extends Fragment {

    //根部view
    private View rootView;
    protected Context context;
    private Boolean hasInitData = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = getActivity();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (rootView == null) {
            rootView = initView(inflater);
        }
        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (!hasInitData) {
            initData();
            hasInitData = true;
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ((ViewGroup) rootView.getParent()).removeView(rootView);
    }

    /**
     * 子类实现初始化View操作
     */
    protected abstract View initView(LayoutInflater inflater);

    /**
     * 子类实现初始化数据操作(子类自己调用)
     */
    public abstract void initData();

    /**
     * 封装从网络下载数据
     */
    protected void loadData(HttpRequest.HttpMethod method, String url,
                            RequestParams params, RequestCallBack<String> callback) {
        if (0 == NetUtils.isNetworkAvailable(getActivity())) {
            new CustomToast(getActivity(), "无网络,请检查网络连接!", 0).show();
        } else {
            NetUtils.loadData(method, url, params, callback);
        }
    }

}</span>

加入rootView,缓存加载后的view,如果有就不重新加载数据。

加入判断是否已经加载数据完成的标志变量,如果已经加载了数据,就不重新加载数据。

算是优雅的解决了优化的问题,希望能帮到有同样问题的同学。

时间: 2024-08-14 20:12:38

关于fragment+viewpager的优化的相关文章

Fragment+ViewPager+TabPageIndicator使用的时候遇到的问题

具体的使用,我就不多说了,可以参考http://blog.csdn.net/lmj623565791/article/details/23513993 我要说是注意事件: 1.TabPageIndicator这个类找不到引入的路径 1.需要下载这个TabPageIndicator框架,http://blog.csdn.net/lmj623565791/article/details/23513993得源代码里面有 2.把下载下来的原代码的viewPagerlibrary项目导入到eclipse里

TabActivity 、fragemnt+fragment 和 Fragment+Viewpager 优缺点

1 TabActivity : 1 过时了 . 2 activity . 是作为android的四大组件... 重量级的家伙 ViewGroup   : 特别麻烦.... 2  viewpage  : 1简单 ...直接设置当前界面 ViewGroup是子类...view 轻量级别的小控件 fragment +viewpager 3. fragment    : fragment + fragment 1 当我们在用V4包的时候...android.support.v4.app ,系统默认给我们

低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航

Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actionbar05; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import a

Android自定义控件---导航栏SlideTab(Fragment+ViewPager)

一.前言 好久没有更新过博客了,趁今天有空分享一个导航栏的自定义控件.有关此控件的demo相信在网上已经烂大街了,一搜一大把. 我现在只着重分享一些我认为比较难理解的知识点.整个控件的难点大概有三个 1.游标的绘制. 2.ViewPager监听器的理解. 3.游标的移动. 本文将注重这三个方面重点分析. 先上Demo的最终效果 二.Demo结构图和知识点 样例Module,有四个java文件和两个xml文件 总结一下此控件的主要知识点 1.ViewGroup绘制流程. 2.ViewPager的用

Android应用经典主界面框架之二:仿网易新闻客户端、CSDN 客户端 (Fragment ViewPager)

第二种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表,使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View,而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter只在这个包里有,在android.app.*这个包下面么

Tab系列 03 FragmentPagerAdapter + Fragment + ViewPager

使用ViewPager + Fragment  + FragmentPagerAdapter 实现tab内容切换 创建一个Activity继承FragmentActivity 适配器: FragmentPagerAdapter 与tab系列01 ViewPager + xml 的区别, ViewPager + Fragment 的区别 Adapter 加载数据 package com.example.tabdemo01; import java.util.ArrayList; import ja

Fragment ViewPager 适配器

http://wangxinghe.me/blog/2015-02-02/android-FragmentPagerAdapter-FragmentStatePagerAdapter/ 一.FragmentPagerAdapter 适合于 Fragment数量不多的情况.当某个页面不可见时,该页面对应的View可能会被销毁,但是所有的Fragment都会一直存在于内存中. 如果Fragment需要保存的状态较多时,会导致占用内存较大,因此对于Fragment数量较多的情况,建议使用Fragmen

Android tab导航的几种方法:ActionBar tab +fragment,Viewpager+pagerTitleStrip,开源框架ViewPageIndicator 和 ViewPager

action来实现tab标签 并跟fragment结合 因为要写新闻客户端这个tab导航是必须的 这里我写几个小练习,希望大家融会贯通. 1actionbar设置tab +fragment 布局是个layout 什么layout都可以 加个Id 叫container package com.example.demoforactionbar; import android.app.ActionBar; import android.app.Activity; import android.app.

安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)

什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再重复. 什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个Activity中,我们可以合并多个Fragment在一个单独的activity中建立多个UI面板,或