Android ViewPager复用调研
一、要调研的问题:
- 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复用调研相关推荐
- android开发实例之viewpager无限循环+自动滚动,Android ViewPager实现无限循环的实例...
Android ViewPager实现无限循环的实例 ViewPager自身并不支持左右无限循环的功能,这里就提供一种方案让Android ViewPager实现左右无限循环的功能,这里记录下: 用于 ...
- android viewpager 嵌套fragment,Android ViewPager+Fragment多层嵌套(使用问题处理)
之前写了Android ViewPager+Fragment(使用问题处理),封装了一个BaseFragment,对于简单使用ViewPager+Fragment而言,是没有问题的. 不过,ViewP ...
- Android -- ViewPager切换动画,PageTransformer
transformPage(View view, float position) view就是滑动中的那个view,position这里是float类型,是当前滑动状态的一个表示,比如当滑动到正全屏时 ...
- android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...
本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...
- android ViewPager 实现点击小圆点切换页面 案例
android ViewPager 实现点击小圆点切换页面 说明:在viewpager中,通过左右滑动可以切换页面,同样可以通过点击所指示的小圆点来滑动到某个页面页面. 具体实现方法如下: 主要ac ...
- Android ViewPager 重复数据问题的解决方法
Android ViewPager 重复数据问题的解决方法 参考文章: (1)Android ViewPager 重复数据问题的解决方法 (2)https://www.cnblogs.com/Linc ...
- Android ViewPager示例教程
ViewPager in Android allows the user to flip left and right through pages of data. In our android Vi ...
- Android 指纹相关调研
Android 指纹相关调研 背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查. 一:指纹的优势 我们传统的登录方式,需要用户输入用户名和密码 ...
- android ViewPager轮播制作成品——轮播制作(六)
android ViewPager轮播制作成品--轮播制作(六) 本文主要参考文章:Android 使用ViewPager实现左右循环滑动图片 下面整体介绍一下本系列文章.目的是想要做一个广告.通知轮 ...
最新文章
- 在交换机上,广播帧是如何发送的,
- 简述泛型的上界和下界?
- vb.net連接ACCESS数据库
- Linux常用命令 积累
- 微信公众平台:反正公众号的一切操作都从这里入手!
- laravel 定时任务
- 创建优秀团队文化的四大要点
- 菜鸟教程 php mysql_PHP MySQL 读取数据 | 菜鸟教程
- Java jni 底层_JAVA语言语言调用底层语言的技术JNI解析
- 关于Secureboot的简单介绍[结合rk平台]
- System.Data.SQLite兼容32位和64位问题
- 快速突破面试算法之树结构篇
- 使用python实现一个(文件版)简单的课程管理系统
- 【图像增强】基于脉冲神经网络PCNN实现图像增强附matlab代码
- 会员制营销与EMAIL营销
- 双链路是什么意思_双链路DVI是什么意思 工作原理是什么
- # Codeforces Round #722(div2)D. Kavi on Pairing Duty
- 地球围绕着太阳的概念和计算
- python中求和符号怎么打_参数siz向量的python符号求和与微分
- 什么是 BigMap 算法