PagerAdapter的instantiateItem方法的执行次数

博客详细探讨了ViewPager在滑动时instantiateItem方法的调用情况。作者通过创建一个简单的Demo发现,ViewPager在加载页面时会预加载前后一张,导致instantiateItem方法并非每次滑动都调用。具体来说,首次加载时,调用两次加载第一页和第二页;滑动到第二页时,因已预加载,不调用;滑动到第三页时,由于预加载机制,不会调用,而是直接显示。只有在滑动回已预加载的页面时,才会再次调用instantiateItem。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前以为ViewPager每次滑动都会调用instantiateItem,后来做项目时发现有时滑动时并不执行写在instantiateItem中的一些更新操作。

于是写了个demo测试一下,代码如下:

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MainActivity extends Activity {
	ViewPager pager;
	List<View> views;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		pager = new ViewPager(this);
		setContentView(pager);
		views = new ArrayList<View>();
		TextView view1 = new TextView(this);
		view1.setText("66666666");
		TextView view2 = new TextView(this);
		view2.setText("77777777");
		TextView view3 = new TextView(this);
		view3.setText("88888888");
		views.add(view1);
		views.add(view2);
		views.add(view3);
		MyPagerAdapter adapter = new MyPagerAdapter();
		pager.setAdapter(adapter);
	}

	class MyPagerAdapter extends PagerAdapter {
		@Override
		public int getCount() {
			return views.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1; // 这行代码很重要,它用于判断你当前要显示的页面
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			container.addView(views.get(position));
			Log.d("instantiateItem tag", String.valueOf(position));
			return views.get(position);
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView(views.get(position));
		}
	}
}

02-04 17:54:14.494 20145-20145/? D/instantiateItem tag: 0
02-04 17:54:14.495 20145-20145/? D/instantiateItem tag: 1
02-04 17:54:17.266 20145-20145/? D/instantiateItem tag: 2
02-04 17:54:19.359 20145-20145/? D/instantiateItem tag: 0

运行时:

当我进入第一页时,log打印 0和1,

当我滑到第二页时,log打印2,

当我滑到第三页时,log没有输出信息。

所以我觉得是这样的。因为pagerAdapter是默认预加载前后一张的,所以当加载第一页时。调用了两次instantiateItem方法,第一次是加载本来的第一页,第二次是预加载第二页,所以log打印了0和1。可是显示的本来加载的第一页。

当滑动到第二页时,只调用了一次instantiateItem方法,是因为本页已经在之前预加载过了,没有再调用instantiateItem方法也就是log不会再打印1,而是直接从ViewGroup中直接取出第二页用于显示。然后进行预加载第三页,所以这里会调用instantiateItem方法并打印2。

接着滑动到第三页,由于第三页也已经预加载过了,所以只是从ViewGroup取出第三页显示而不调用instantiateItem。但是由于预加载默认是前后一张,所以这时会从ViewGroup中取出第一页销毁

直到从第三页滑到第二页时才会再预加载第一页。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值