一、要调研的问题:

  • 1、ViewPager有复用机制吗???
  • 2、ViewPager中最多存在多少View???

二、测试demo代码

GuideViewDemoActivity代码:

package com.lenovo.guidedemo;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
/*** * @author http://xiaxveliang.blog.163.com/**/
public class GuideViewDemoActivity extends Activity {private static final String TAG = "xiaxl1: "+ GuideViewDemoActivity.class.getSimpleName();private ViewPager viewPager = null;private ArrayList<View> pageViews = new ArrayList<View>();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "-----onCreate--------");this.requestWindowFeature(Window.FEATURE_NO_TITLE);/*** 显示当前View*/setContentView(R.layout.main);/*** 造数据*/LayoutInflater inflater = getLayoutInflater();for (int i = 0; i < 5; i++) {View tempView = inflater.inflate(R.layout.item01, null);// setTAGtempView.setTag(i + "");// addpageViews.add(tempView);}/*** 初始化UI*/viewPager = (ViewPager) findViewById(R.id.guidePages);viewPager.setAdapter(new GuidePageAdapter());//findViewById(R.id.button1).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {viewPager.setCurrentItem(5);}});}class GuidePageAdapter extends PagerAdapter {@Overridepublic int getCount() {Log.d(TAG, "-----getCount--------");Log.d(TAG, "pageViews.size(): " + pageViews.size());return pageViews.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {Log.d(TAG, "-----isViewFromObject--------");if (arg0.getTag() != null) {String str = (String) arg0.getTag();Log.d(TAG, "arg0.getTag(): " + str);}if (arg1 instanceof View) {View tempView = (View) arg1;if (tempView.getTag() != null) {String str = (String) tempView.getTag();Log.d(TAG, "arg1.getTag(): " + str);}}Log.d(TAG, "arg0 == arg1: " + (arg0 == arg1));return arg0 == arg1;}@Overridepublic int getItemPosition(Object object) {Log.d(TAG, "-----getItemPosition--------");return super.getItemPosition(object);}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {Log.d(TAG, "-----destroyItem--------");Log.d(TAG, "arg1: " + arg1);if (arg2 instanceof View) {View tempView = (View) arg2;if (tempView.getTag() != null) {String str = (String) tempView.getTag();Log.d(TAG, "arg2.getTag(): " + str);}}if (pageViews.get(arg1).getTag() != null) {String str = (String) pageViews.get(arg1).getTag();Log.d(TAG, "pageViews.get(arg1).getTag(): " + str);}((ViewPager) arg0).removeView(pageViews.get(arg1));}@Overridepublic Object instantiateItem(View arg0, int arg1) {Log.d(TAG, "-----instantiateItem--------");Log.d(TAG, "arg1: " + arg1);if (pageViews.get(arg1).getTag() != null) {String str = (String) pageViews.get(arg1).getTag();Log.d(TAG, "pageViews.get(arg1).getTag(): " + str);}((ViewPager) arg0).addView(pageViews.get(arg1));return pageViews.get(arg1);}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {}@Overridepublic Parcelable saveState() {return null;}@Overridepublic void startUpdate(View arg0) {}@Overridepublic void finishUpdate(View arg0) {}}
}

三、测试滑动过程中View的创建和销毁

1、一页一页顺序滑动

(1)、ViewPager创建时的log(当前显示页面为index为0的页面)

-----instantiateItem--------
arg1: 0
pageViews.get(arg1).getTag(): 0
-----instantiateItem--------
arg1: 1
pageViews.get(arg1).getTag(): 1 

由log可以看出,ViewPager创建了0、1两个页面,当前显示页面为index为0的页面

(2)、ViewPager向后滑动一页(当前显示界面为第1页)

-----instantiateItem--------
arg1: 2
pageViews.get(arg1).getTag(): 2 

由log可以看出,ViewPager创建了0、1、2 三个页面,当前显示页面为index为1的页面

(3)、ViewPager再次向后滑动一页(当前显示界面为第2页)

-----destroyItem--------
arg1: 0
arg2.getTag(): 0
pageViews.get(arg1).getTag(): 0
-----instantiateItem--------
arg1: 3
pageViews.get(arg1).getTag(): 3 

由log可以看出,ViewPager先销毁了index为0的页面,然后创建了index为3的页面。ViewPager中存在的页面为1、2、3,当前显示页面为index为2的页面

(4)、顺序滑动的结论

由以上log可以确定,顺序滑动过程中:
+ 1)、ViewPager中最多存在3个View,最少存在两个View;
+ 2)、在创建新的View之前,先销毁之前的无用View;
+ 3)、顺序滑动过程中ViewPager没有自己的View重用机制,只有View的不断销毁和创建,保证ViewPager最多存在3个孩子。

(5)、顺序滑动时的性能问题

  • 1)、View创建和销毁时,Java虚拟机对内存的回收不一定及时,可能造成内存图片的大量堆积
  • 2)、垃圾回收很占时间,可能造成翻页卡顿

2、从第一页直接跳转到最后一页

(1)、ViewPager创建时的log(当前显示页面为index为0的页面)

-----instantiateItem--------
arg1: 0
pageViews.get(arg1).getTag(): 0
-----instantiateItem--------
arg1: 1
pageViews.get(arg1).getTag(): 1 

由log可以看出,ViewPager创建了0、1两个页面,当前显示页面为index为0的页面

(2) ViewPager直接跳转到index为4的页面(当前显示界面为index为4的页面)

-----instantiateItem--------
arg1: 3
pageViews.get(arg1).getTag(): 3
-----instantiateItem--------
arg1: 4
pageViews.get(arg1).getTag(): 4
-----destroyItem--------
arg1: 0
arg2.getTag(): 0
pageViews.get(arg1).getTag(): 0
-----destroyItem--------
arg1: 1
arg2.getTag(): 1
pageViews.get(arg1).getTag(): 1 

由log可以看出,ViewPager先创建了3、4两个页面,此时ViewPager存在0、1、3、4,四个孩子。然后ViewPager销毁了index为0、1的界面。此时ViewPager中存在index为3、4的界面,当前显示界面为index为4的界面。

(3)、跳转滑动的结论

由以上log可以确定,跳转滑动过程中:
+ 1)、ViewPager中最多存在6个View(销毁View之前),最少存在两个View;
+ 2)、在销毁旧的View之前,先创建了新的View,造成ViewPager中最多可存在6个View。如果View中图片较多,内存崩溃的可能性比较大。
+ 3)、跳转滑动过程中ViewPager没有自己的View重用机制,只有View的不断销毁和创建,保证ViewPager最多存在6个孩子。

四、调研结论:

  • 1)、ViewPager中没有View的重用机制(若要重用,需自己实现)
  • 2)、ViewPager中最多存在6个孩子(跳转滑动时),最少存在2个孩子(刚进入页面时);

Android ViewPager复用调研相关推荐

  1. android开发实例之viewpager无限循环+自动滚动,Android ViewPager实现无限循环的实例...

    Android ViewPager实现无限循环的实例 ViewPager自身并不支持左右无限循环的功能,这里就提供一种方案让Android ViewPager实现左右无限循环的功能,这里记录下: 用于 ...

  2. android viewpager 嵌套fragment,Android ViewPager+Fragment多层嵌套(使用问题处理)

    之前写了Android ViewPager+Fragment(使用问题处理),封装了一个BaseFragment,对于简单使用ViewPager+Fragment而言,是没有问题的. 不过,ViewP ...

  3. Android -- ViewPager切换动画,PageTransformer

    transformPage(View view, float position) view就是滑动中的那个view,position这里是float类型,是当前滑动状态的一个表示,比如当滑动到正全屏时 ...

  4. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...

    本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...

  5. android ViewPager 实现点击小圆点切换页面 案例

    android ViewPager  实现点击小圆点切换页面 说明:在viewpager中,通过左右滑动可以切换页面,同样可以通过点击所指示的小圆点来滑动到某个页面页面. 具体实现方法如下: 主要ac ...

  6. Android ViewPager 重复数据问题的解决方法

    Android ViewPager 重复数据问题的解决方法 参考文章: (1)Android ViewPager 重复数据问题的解决方法 (2)https://www.cnblogs.com/Linc ...

  7. Android ViewPager示例教程

    ViewPager in Android allows the user to flip left and right through pages of data. In our android Vi ...

  8. Android 指纹相关调研

    Android 指纹相关调研 背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查. 一:指纹的优势 我们传统的登录方式,需要用户输入用户名和密码 ...

  9. android ViewPager轮播制作成品——轮播制作(六)

    android ViewPager轮播制作成品--轮播制作(六) 本文主要参考文章:Android 使用ViewPager实现左右循环滑动图片 下面整体介绍一下本系列文章.目的是想要做一个广告.通知轮 ...

最新文章

  1. 在交换机上,广播帧是如何发送的,
  2. 简述泛型的上界和下界?
  3. vb.net連接ACCESS数据库
  4. Linux常用命令 积累
  5. 微信公众平台:反正公众号的一切操作都从这里入手!
  6. laravel 定时任务
  7. 创建优秀团队文化的四大要点
  8. 菜鸟教程 php mysql_PHP MySQL 读取数据 | 菜鸟教程
  9. Java jni 底层_JAVA语言语言调用底层语言的技术JNI解析
  10. 关于Secureboot的简单介绍[结合rk平台]
  11. System.Data.SQLite兼容32位和64位问题
  12. 快速突破面试算法之树结构篇
  13. 使用python实现一个(文件版)简单的课程管理系统
  14. 【图像增强】基于脉冲神经网络PCNN实现图像增强附matlab代码
  15. 会员制营销与EMAIL营销
  16. 双链路是什么意思_双链路DVI是什么意思 工作原理是什么
  17. # Codeforces Round #722(div2)D. Kavi on Pairing Duty
  18. 地球围绕着太阳的概念和计算
  19. python中求和符号怎么打_参数siz向量的python符号求和与微分
  20. 什么是 BigMap 算法

热门文章

  1. XT702:mount命令释疑
  2. kylinTOP下载安装
  3. 自己构建pomelo的Cocos2d-iPhone Client
  4. 【云安全系列】Seccomp—云安全syscall防护利器
  5. 代理服务器对比HA,NGINX
  6. 免费的Revit模型的查看软件
  7. 推荐一个科研党的翻译神器
  8. 2021-12-3 ds18x20包装库 9元钱的 ds18B20 esp8266 micropython 记录
  9. php采集节目单,基于PHP的电视节目预告示例代码-六派数据
  10. (转)英文学习资源站点