`
djun100
  • 浏览: 165315 次
  • 性别: 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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics