android ViewPager中页面延迟加载的实现

对于viewpager的使用,如果说是请求的数据对内存的消耗不到的话,这是很理想的,但是如果说请求的数据对内存消耗的比较大的话这样就容易出现oom(比如说图片),在使用viewPager的时候使用setOffscreenPageLimit(int size)默认的是1,所以说我们怎么设置这个值,在加载数据的话会将当前页面和下个页面的数据同时的进行请求,这在某种情况下时非常的影响性能的,还有就是在当前页面和下个页面在viewPager中算作了同一个页面,因为你是无法通过生命周期来进行控制数据的延迟加载,所以现在很多网友通过修改v4包进行修改setOffscreenPageLimit(int size)的默认值为0;但是这样虽然效果实现了,但是会引发另一个问题,那就是在切换页面时,中间过渡的是一个大大的黑屏,myGod的这种修改对体验算是致命的打击对于我而言,不过最后终于还是被我搞定了;

之前的一种方式在我之前的博客中有写,下面介绍的是另一种方式:结合Fragment来处理,废话不说直接上代码:

MainActivity public class MainActivity extends FragmentActivity {

    private ViewPager pager;
    private ArrayList<Fragment> fts = new ArrayList<Fragment>();
    private String[] urls = new String[]{
            "http://t2.qpic.cn/mblogpic/d5149f8549e394000aa6/2000",
            "http://t2.qpic.cn/mblogpic/fad173ab259d7efbfecc/2000",
            "http://t2.qpic.cn/mblogpic/463b55016d51d4b9c172/2000",
            "http://t2.qpic.cn/mblogpic/ab3f96d6095ec82e6d40/2000",
            "http://t2.qpic.cn/mblogpic/e61f017bcad2684e79f2/2000",
            "http://t2.qpic.cn/mblogpic/d271142c68e6e1d5b8de/2000",
            "http://t2.qpic.cn/mblogpic/ef50986bdf4dd8801060/2000",
            "http://t2.qpic.cn/mblogpic/71585d34aaa60b9dcc2a/2000",
            "http://t2.qpic.cn/mblogpic/e0011bad45ae23889216/2000",
            "http://t2.qpic.cn/mblogpic/6e84cb60bf0e6b4945f6/2000",

            "http://t2.qpic.cn/mblogpic/5a9217624c130c2fa9f8/2000",
            "http://t2.qpic.cn/mblogpic/7ddb0e9618754fc4bc8e/2000",
            "http://t2.qpic.cn/mblogpic/eed45f9d4b5001a04b30/2000",
            "http://t2.qpic.cn/mblogpic/62353a0dbdd40bc1be9a/2000",
            "http://t2.qpic.cn/mblogpic/0ccf7f16318331e9a892/2000",
            "http://t2.qpic.cn/mblogpic/4e55efffef93f6d4a86e/2000",
            "http://t2.qpic.cn/mblogpic/4ac76f1427e4278b7172/2000",
            "http://t2.qpic.cn/mblogpic/0db3a5a1047d7ee52bdc/2000",
            "http://t2.qpic.cn/mblogpic/c65d09035d7b6c644d6a/2000",
            "http://t2.qpic.cn/mblogpic/7ebf4b49bf7e2ef6a716/2000",

            "http://t2.qpic.cn/mblogpic/4ba5fd867149273f9b02/2000",
            "http://t2.qpic.cn/mblogpic/4f375f19fbd08151d0f8/2000",
            "http://t2.qpic.cn/mblogpic/1c22a0574274d0e3c866/2000",
            "http://t2.qpic.cn/mblogpic/50cdf4f63120ccf74e86/2000",
            "http://t2.qpic.cn/mblogpic/ab8588008e7865927d7c/2000",
            "http://t2.qpic.cn/mblogpic/1e9e65d61d5f2bb8ebc4/2000",
            "http://t2.qpic.cn/mblogpic/6913e7ad5c7267969d9a/2000",
            "http://t2.qpic.cn/mblogpic/54157580cc7ddf7b2870/2000",
            "http://t2.qpic.cn/mblogpic/0bd2f9be53d2c9aec8ca/2000",
            "http://t2.qpic.cn/mblogpic/2041a03d63cc6c5b9b92/2000",

    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        pager = (ViewPager) findViewById(R.id.pager);

        for (int i = 0; i < urls.length; i++) {
            fts.add(PhotoFragment.instance(urls[i], i));
        }
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager(), fts));
        pager.setOffscreenPageLimit(fts.size());
        pager.setCurrentItem(0);

    }

    private class MyPagerAdapter extends FragmentPagerAdapter{

        private ArrayList<Fragment> list;

        public MyPagerAdapter(FragmentManager fm,ArrayList<Fragment> list) {
            super(fm);
            this.list = list;
        }

        @Override
        public Fragment getItem(int arg0) {
            return list.get(arg0);
        }

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

    }
}

PhotoFragment:

package com.zhizhi.viewpagernocache;

import com.nostra13.universalimageloader.core.ImageLoader;

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

public class PhotoFragment extends Fragment {

    private final static String TAG = PhotoFragment.class.getName();
    private String url;
    private int index;
    private ImageView image;

    public static PhotoFragment instance(String url, int index) {
        PhotoFragment fragment = new PhotoFragment();
        Bundle bundle = new Bundle();
        bundle.putString("url", url);
        bundle.putInt("index", index);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            url = getArguments().getString("url");
            index = getArguments().getInt("index");
        }
        setRetainInstance(true);

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("url", url);
        outState.putInt("index", index);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            url = savedInstanceState.getString("url");
            index = savedInstanceState.getInt("index");
        }
        View view = inflater.inflate(R.layout.view_photo, container, false);
        image = (ImageView) view.findViewById(R.id.image);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            Log.i(TAG, "get pic data for show");
            ImageLoader.getInstance().displayImage(url, image);
        }
    }

}

以上就是代码的核心部分了;

源码Demo :http://files.cnblogs.com/kingfly13/ViewPagerNoCache.zip

android ViewPager中页面延迟加载的实现

时间: 2024-11-08 22:17:34

android ViewPager中页面延迟加载的实现的相关文章

Android借助Handler,实现ViewPager中页面的自动切换(转)

在很多电商网页及app上都有自动切换的商品的推广快,感觉体验挺不错的,正好今天学习使用ViewPager,因此也实现了一个功能类似的demo. 下面是其中的两个截图:           实现一个自动播放功能的ViewPager,要做的主要有以下的几个部分: 实现一个ViewPagerAdapter,用于为ViewPager提供展示内容(例如上面的两张小猫图片) public class ViewPagerAdapter extends PagerAdapter { private List<V

[Android] Android ViewPager 中加载 Fragmenet的几种方式

Android ViewPager 中加载 Fragmenet的几种方式 1.当fragment里面的内容较少时,可以利用加载view 的方法来进行: private List<View> viewList; //在onCreate方法里面添加  viewList = new ArrayList<View>();        View view1 = View.inflate(this, R.layout.view1, null);        View view2 = Vie

[Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二.使用Fragment来填充ViewPager Google 官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page以及管理 每个Page的生命周期!当然它给我们提供了两个不同的Adapter,他们分别是: FragmentPageAdapter和Fragm

android viewpager change adapter ---在使用viewpager设置新的adapter的时候发现页面还是显示旧的adapter中的值

有一个需求是当用户选择navigationview中的某一项时,右边的viewpager需要动态切换不同的adapter 发现直接setAdapter没有任何反应,加载的数据还是旧的数据 折腾了半天只需要将 FragmentPagerAdapter 换成 FragmentStatePagerAdapter就好了具体百度两者区别,有时间我写个总结出来大概的理解: FragmentPagerAdapter会缓存多个数据,适合viewpager中的数据不会经常变化 FragmentStatePager

android UI之ViewPager多页面滑动效果

  viewPager实现引导页 ViewPager多页面滑动效果 1.Android的左右滑动在实际编程经常能用到,比如查看多张图片,左右 切换tab页. 2.自android 3.0之后的SDK中提供了android-support-V4包用以实现 版本兼容,让老版本系统下的应用通过加入jar包实现扩展,其中有一 个可以实现左右滑动的类ViewPager 今天我们就用ViewPager类来实现引导页的实战案例 实现功能: 1.实现ViewPager多页面滑动效果. 2.下方的显示当前

android ViewPager页面左右滑动切换

我们日常生活中用到的微博,QQ,微信等app在进行页面左右滑动的时候,很多都可以用ViewPager来实现.可以说,ViewPager在android开发中十分常见并且特别实用. Viewpager在android.support.v4.view这个软件包中, android.support.v4.view.jar是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api.所以低版本开发时必须加入android-support-v4.jar,并且在XML

android listview中item通过viewpager实现

android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项目主要介绍多个viewpager加载图片和listview 上下滑动不卡顿问题.本项目由作者Flyco分享的分享地址:https://github.com/H07000223/FlycoBanner_Master.本项目找对应id封装一个ViewFindUtils类,通过如下代码找id    /**

Android程序中Web页面和NativeCode交互

首先应该在AndroidManifest.xml把下面这个加上使得具有网络访问权限 <uses-permission android:name="android.permission.INTERNET"/> 然后在布局文件上插入WebView main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

友盟页面统计 - 关于Viewpager中的Fragment的生命周期

Activity和Fragment各自理论上的生命周期 Activity的生命周期是较为经典也最清晰的.在此不表: Fragment从出现到广泛运用也有一段时间了.其标准生命周期也仅比Activity多出一些流程,如onCreateView(); Activity和Fragment在实际编码中必然是结合出现的,表现为Activity作为容器,装载有一个或若干个Fragment: 装载多个Fragment时,常常使用TabHost和Viewpager作为载体: 在实际编码中发现,Activity和