• ViewPager的缓存机制


    1.实现Viewpager的页面懒加载:

    在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容。

    2.可控Viewpager缓存页面的数量:

    常见的情况:

    (1)页面的总数是已知的,或者可以计算出来,每个页面占用的资源并不多并且需要经常使用这些页面。这时可以考虑将其常驻ViewPager而不去销毁(频繁的销毁和重建也会消耗比较多的资源)。

    (2)切换页面时默认情况下非相邻的页面会被销毁掉(ViewPager默认缓存或预加载相邻的页面以便快速切换),如果想要保持页面之前的状态,如滚动条滚动位置等比较困难;这时可以考虑将之前的页面缓存下来而不销毁掉。

    ViewPager的默认加载与缓存模式

    ViewPager和ListView、GridView等的数据加载方式类似,控件本身都提供了数据加载的适配器接口,程序员只需实现特定的Adapter就可以轻松的将数据填充到容器中。

    我们来看一个简单的Demo。

    1.ViewPager懒加载和缓存测试类

    public class MainActivity extends Activity {  
        private static final String TAG = "com.example.viewpagertest.MainActivity";  
        private MyViewPager viewPager;  
        private List<View> pagers = new ArrayList<View>();  
        /** ViewPager缓存页面数目;当前页面的相邻N各页面都会被缓存 */  
        private int cachePagers = 1;  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            getViews();  
            setContentView(viewPager);  
            setListener();  
            setAdapter();  
        }  
        private void getViews() {  
            viewPager = new MyViewPager(this);  
            for (int i = 0; i < 5; i++) {  
                TextView textView = new TextView(this);  
                pagers.add(textView);  
                viewPager.onDisplay(i);//测试1  
            }  
            viewPager.setOffscreenPageLimit(cachePagers);// 设置缓存页面,当前页面的相邻N各页面都会被缓存  
        }  
        private void setAdapter() {  
            viewPager.setAdapter(pagerAdapter);  
        }  
        private void setListener() {  
            viewPager.setOnPageChangeListener(pageChangeListener);  
        }  
        /** 
         * 页面数据适配器 
         */  
        private PagerAdapter pagerAdapter = new PagerAdapter() {  
            @Override  
            public void destroyItem(View container, int position, Object object) {  
                Log.i(TAG, "destroyItem:" + position);  
                ((ViewGroup) container).removeView((View) object);  
            }  
            @Override  
            public void destroyItem(ViewGroup container, int position, Object object) {  
                Log.i(TAG, "destroyItem:" + position);  
                container.removeView((View) object);  
            }  
            @Override  
            public Object instantiateItem(View container, int position) {  
                Log.i(TAG, "instantiateItem:" + position);  
                try {  
                    ((ViewPager) container).addView(pagers.get(position));  
                    // ((MyViewPager) container).onDisplay(position);//测试2  
                } catch (Exception e) {  
                    Log.e(TAG, e.getMessage());  
                }  
                return pagers.get(position);  
            }  
            @Override  
            public Object instantiateItem(ViewGroup container, int position) {  
                Log.i(TAG, "instantiateItem:" + position);  
                try {  
                    ((ViewPager) container).addView(pagers.get(position));  
                    // ((MyViewPager) container).onDisplay(position);//测试2  
                } catch (Exception e) {  
                    Log.e(TAG, e.getMessage());  
                }  
                return pagers.get(position);  
            }  
            @Override  
            public boolean isViewFromObject(View arg0, Object arg1) {  
                return arg0 == arg1;  
            }  
            @Override  
            public int getCount() {  
                return pagers.size();  
            }  
        };  
        /** 
         * 页面滚动监听器 
         */  
        private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {  
            @Override  
            public void onPageSelected(int arg0) {  
                Log.i(TAG, "onPageSelected:" + arg0);  
                // viewPager.onDisplay(arg0);//测试3  
            }  
            @Override  
            public void onPageScrolled(int arg0, float arg1, int arg2) {  
            }  
            @Override  
            public void onPageScrollStateChanged(int arg0) {  
            }  
        };  
        /** 
         * @Title setPageData 
         * @Description 加载页面数据 
         * @param position 
         */  
        private void setPageData(int position) {  
            TextView textView = (TextView) pagers.get(position);  
            textView.setText("pager" + position);  
            Log.i(TAG, "setPageData position:" + position);  
        }  
        class MyViewPager extends ViewPager implements IPagerDisplay {  
            public MyViewPager(Context context) {  
                super(context);  
            }  
            public MyViewPager(Context context, AttributeSet attrs) {  
                super(context, attrs);  
            }  
            @Override  
            public void onDisplay(int position) {  
                setPageData(position);  
            }  
        }  
    }  

    2.ViewPager数据展示回调接口

    /** 
     * @Title IPagerDisplay.java 
     * @Package com.example.viewpagertest 
     * @Description ViewPager数据展示回调 
     * @author ze.chen 
     * @date 2013-5-13 下午2:25:38 
     * @version V1.0 
     */  
    package com.example.viewpagertest;  
    /** 
     * @ClassName IPagerDisplay 
     * @Description ViewPager懒加载展接口;可以在PagerAdapter的instantiateItem时候调用, 
     *              亦可以在OnPageChangeListener的onPageSelected时候调用 
     *              ,两处的区别在于,instantiateItem方法ViewPager会自动缓冲 
     *              (浏览pager1时将pager2的数据加载好), 
     *              而onPageSelected则不会自动缓冲(浏览pager2时才加载pager2的数据) 
     * @author ze.chen 
     * @date 2013-5-13 下午2:25:38  
     * 
     */  
    public interface IPagerDisplay {  
        void onDisplay(int position);  
    }  

    使ViewPager支持懒加载

    在以上代码段中,分别注释了:测试1;测试2;测试3。

    测试1:在加载ViewPager之前,初始化所有的页面和数据。

    viewPager = new MyViewPager(this);  
            for (int i = 0; i < 5; i++) {  
                TextView textView = new TextView(this);  
                pagers.add(textView);  
                viewPager.onDisplay(i);//测试1  
            } 

    对于测试2和测试3,只将控件添加到pagers列表中,数据不立刻加载
    测试2:在ViewPager的页面实例化的时候加载数据,预加载的时候也会执行该方法。

    public Object instantiateItem(View container, int position) {  
                Log.i(TAG, "instantiateItem:" + position);  
                try {  
                    ((ViewPager) container).addView(pagers.get(position));  
                    ((MyViewPager) container).onDisplay(position);//测试2  
                } catch (Exception e) {  
                    Log.e(TAG, e.getMessage());  
                }  
                return pagers.get(position);  
            }  

    测试3:当该页面被选中的时候才加载该页面的数据,预加载页面时不会加载预加载页的数据。

    private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {  
            @Override  
            public void onPageSelected(int arg0) {  
                Log.i(TAG, "onPageSelected:" + arg0);  
                viewPager.onDisplay(arg0);//测试3  
            }  
    ……  

    修改ViewPager的缓存页面数量

    viewPager.setOffscreenPageLimit(int numbers); 

    viewpager当前页面两侧缓存/预加载的页面数目。当页面切换时,当前页面相邻两侧的numbers页面不会被销毁。

  • 相关阅读:
    eclipse中设置自动生成的author,date等注释
    JSP基本指令
    java代码注释规范
    java中的 FileWriter类 和 FileReader类的一些基本用法
    关于java中BufferedReader的read()及readLine()方法的使用心得
    java开发中经典的三大框架SSH
    Java访问修饰符(访问控制符)
    Linux环境变量具体内容介绍
    MSG结构体和WndProc窗口过程详解
    Java当出现未被捕获的异常应该如何处理
  • 原文地址:https://www.cnblogs.com/Joanna-Yan/p/4824434.html
Copyright © 2020-2023  润新知