`
djun100
  • 浏览: 165764 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android中使用ViewPager循环滑屏动态加载数据(仿多看)

 
阅读更多
ViewPager相信大家都很熟悉,4.x前都需要导入android-support-v4.jar,4.x后sdk已提供支持; 应用场景也很常见,一般应用于程序的引导页;应用也很简单,一个Adapter就可以搞定,代码如下:
public class MyViewPagerAdapter extends PagerAdapter{
		private List<View> mListViews;

		public MyViewPagerAdapter(List<View> mListViews) {
			this.mListViews = mListViews;//构造方法,参数是我们的页卡,这样比较方便。
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) 	{
			container.removeView(mListViews.get(position));//删除页卡
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) {	//这个方法用来实例化页卡
			 container.addView(mListViews.get(position), 0);//添加页卡
			 return mListViews.get(position);
		}

		@Override
		public int getCount() {
			return  mListViews.size();//返回页卡的数量
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0==arg1;//官方提示这样写
		}
	}

但这不是我们今天要讲的主题,我们今天说的是关键词是:动态加载、循环滑屏….
应用场景不再局限与程序引导,而在数据交互之间体现;下面请看实现效果图:

20131004211151

20131004211217

下面我们来看看如何去做,先上Activity代码,代码是主项目中抠下来的:

viewPager = (ViewPager) findViewById(R.id.viewPager);
		listViews = new ArrayList<View>();
		//初始化ViewPager
		bookShelfView = new BookshelfCompositeView(this);//
		bookCityView = new OxygenBookCityView(this);//
		readFriendsView = new ReadFriendsCircleView(this);//

		listViews.add(bookShelfView);//
		listViews.add(bookCityView);//
		listViews.add(readFriendsView);//

		mPagerAdapter = new MyPagerAdapter(listViews, this);
		mPagerAdapter.setLoadTag(false);
		viewPager.setAdapter(mPagerAdapter);
		viewPager.setCurrentItem(COUNT);
		viewPager.setOnPageChangeListener(listener);

/**
	 * 创建View
	 */
	public void createView(int currentItem) {
		if (currentItem == BOOKSHELF_ITEM) {
			// 书架
			if (bookShelfView instanceof IPanelView) {
				((IPanelView) bookShelfView).onCreate();
			}
		} else if (currentItem == BOOKCITY_ITEM) {
			// 书城
			if (bookCityView instanceof IPanelView) {
				((IPanelView) bookCityView).onCreate();
			}
		} else if (currentItem == READFRIENDS_ITEM) {
			// 读友圈
			if (readFriendsView instanceof IPanelView) {
				((IPanelView) readFriendsView).onCreate();
			}
		}
	}

OnPageChangeListener listener = new OnPageChangeListener() {

		@Override
		public void onPageSelected(int arg0) {
			// TODO Auto-generated method stub

			LogUtil.e("当前页面索引:" + arg0);
		}

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			// TODO Auto-generated method stub

		}

		@Override
		public void onPageScrollStateChanged(int arg0) {
			// TODO Auto-generated method stub

		}
	};
Activity主要对ViewPager做了初始化的操作,主要是Adapter代码实现:
public class MyPagerAdapter extends PagerAdapter {

	public List<View> listViews = null;
	public HashMap<View, Boolean> loadTag;
	public MainNewActivity mContext;
	public int mIndex;//滑动索引

	public MyPagerAdapter(List<View> listViews, MainNewActivity mContext) {
		this.listViews = listViews;
		this.mContext = mContext;
		loadTag = new HashMap<View, Boolean>();
	}

	/**
	 * 设置加载标志
	 *
	 * @param tag
	 */
	public void setLoadTag(boolean tag) {
		if (listViews != null && listViews.size() > 0) {
			int size = listViews.size();
			for (View views : listViews) {
				loadTag.put(views, tag);
			}
		}
	}

	@Override
	public int getCount() {
		return Integer.MAX_VALUE;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == arg1;
	}

	@Override
	public void destroyItem(View container, int position, Object object) {
		// LogUtil.e("TipsPagerAdapter", "destroyItem is called   " + position);
		// ((ViewPager) container).removeView(listViews.get(position %
		// listViews.size()));
	}

	@Override
	public CharSequence getPageTitle(int position) {
		return super.getPageTitle(position);
	}

	@Override
	public Object instantiateItem(View container, int position) {
		LogUtil.e("TipsPagerAdapter", "instantiateItem is called   " + position);
		try {
			((ViewPager) container).addView(
					listViews.get(position % listViews.size()), 0);
		} catch (Exception e) {

		}
		// ((ViewPager) container).addView(listViews.get(position);
		// return listViews.get(position);
		LogUtil.e("instantiateItem>>>>>>" + position % listViews.size());

		return listViews.get(position % listViews.size());
	}

	/**
	 * 进行View预加载处理
	 */
	@Override
	public void setPrimaryItem(View container, int position, Object object) {
		// TODO Auto-generated method stub
		super.setPrimaryItem(container, position, object);
		LogUtil.e("setPrimaryItem>>>>>>" + position % listViews.size());
		mIndex = position % listViews.size();
		if (loadTag.get(listViews.get(mIndex)) == false) {
			mContext.createView(mIndex);
			loadTag.put(listViews.get(mIndex), true);
		}
	}
}

这里有必要解释和注意一下:

循环滑动是通过初始化一个较大的CurrentItem(页数)在getview中通过position % listViews.size()实现,看上去实现了循环滑动,实则假循环,但当用户向左滑动CurrentItem次后就无法滑动,所以建议将CurrentItem值越大越好,试想一下哪个用户那么无聊不停去滑动直到突破你的滑动值呢。

动态加载在setPrimaryItem中实现,每次滑动都会调用setPrimaryItem,所以在这里可以进行网络加载,这里我loadTag判断是否需要重复加载。

讲到这里就今天的内容就告一段落。由于这个实现是项目中的一部分,所以源码今天就不放了,等有时间我将整理成一个demo放上来。

转自:http://www.u3dblog.com/?p=559

分享到:
评论

相关推荐

    基于VB实现的商场管理系统设计(源代码+系统).zip

    【作品名称】:基于VB实现的商场管理系统设计(源代码+系统) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    数据更新至2020年主要发电企业火电机组分容量等级发电装机容量情况.xls

    数据来源:中国电力统计NJ-2021版

    数据更新至2020年电网建设 本年开工规模.xls

    数据来源:中国电力统计NJ-2021版

    基于C# WinForm框架开发的图书管理系统源码+sql文件.zip

    基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip基于C# WinForm框架开发的图书管理系统源码+sql文件.zip

    毕业设计(论文)-基于Android系统的人事管理系统设计与实现(48页).doc

    毕业设计(论文)-基于Android系统的人事管理系统设计与实现(48页).doc

    pentair 5800 SXT软水机说明书

    pentair 5800 SXT软水机说明书

    (更新至2022年)各地区乡村分性别的15岁及以上文盲人口.xls

    数据来源:中国人口与就业统计NJ-2023版

    node-v12.11.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v9.6.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    (更新至2022年)全国镇分年龄、性别的人口数.xls

    数据来源:中国人口与就业统计NJ-2023版

    (更新至2022年)消费物价指数 (2019年10月-2020年9月=100).xls

    数据来源:中国人口与就业统计NJ-2023版

    node-v10.23.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.6.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v11.4.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    小区物业管理系统设计与实现.docx

    小区物业管理系统设计与实现.docx

    律师事务所办公管理系统设计及实现.doc

    律师事务所办公管理系统设计及实现.doc

    基于Qt与Android的KTV管理系统设计与实现毕业论文(25页).doc

    基于Qt与Android的KTV管理系统设计与实现毕业论文(25页).doc

    消费价格指数(2010年=100).xls

    数据来源:中国劳动统计NJ-2023版

    华为 OD 机考攻略-加强版

    附件是华为 OD 机考攻略_加强版,文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    node-v12.13.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics