好记性不如铅笔头

android, 编程

Android应用开发笔记:ViewPager的使用和循环设置

ViewFlipper和ViewPager都是android的组件,它们有什么不同呢?看到【 http://www.eoeandroid.com/thread-276918-1-1.html 】有个回帖很经典,就抄过来:

ViewFlipper继承ViewAnimator,切换view的时候是有动画效果的,适合做ppt,多界面的程序欢迎引导界面,算是个轻量级的组件,适合展示静态数据,少量数据。
ViewPager继承ViewGroup。看官网描述,这货和Fragment是好搭档,Fragment有自己的生命周期。也就是说ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载。

 这里先简单的备份下学习心得。

github

https://github.com/cstriker1407/android/tree/master/HelloViewPager 】

CONTENTS

ViewPager的简单使用

学习代码主要参考【 http://blog.csdn.net/wangjinyu501/article/details/8169924 】。由于篇幅关系,就不在拷贝到本日志里了。

更多参考

http://my.eoe.cn/fashr314/archive/10358.html 】

http://blog.csdn.net/android_tutor/article/details/7980239 】

http://www.cnblogs.com/dwinter/archive/2012/02/27/AndroidViewPager%E5%A4%9A%E9%A1%B5%E9%9D%A2%E6%BB%91%E5%8A%A8%E5%88%87%E6%8D%A2%E4%BB%A5%E5%8F%8A%E5%8A%A8%E7%94%BB%E6%95%88%E6%9E%9C.html 】

ViewPager的循环实现

public class MainActivity extends Activity 
{
	private static final int page_size = 5000;
	
	private View view1, view2, view3, view4;
	private ViewPager viewPager;
	private List<View> viewList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = (ViewPager) findViewById(R.id.viewpager); 
        view1 = View.inflate(this,R.layout.layout1, null);  
        view2 = View.inflate(this,R.layout.layout2, null);  
        view3 = View.inflate(this,R.layout.layout3, null);  
        view4 = View.inflate(this,R.layout.layout4, null);  
  
        viewList = new ArrayList<View>();// 将要分页显示的View装入数组中  
        viewList.add(view1);  
        viewList.add(view2);  
        viewList.add(view3);  
        viewList.add(view4);  
  
        PagerAdapter pagerAdapter = new PagerAdapter() {  
  
            @Override  
            public boolean isViewFromObject(View arg0, Object arg1)
            {  
                return arg0 == arg1;  
            }  
  
            @Override  
            public int getCount() {  
            	return page_size;
            }  
  
            @Override  
            public void destroyItem(ViewGroup container, int position,  
                    Object object) 
            {
            	Log.d("", "destroy item called:" + position);
            	
            	View view = viewList.get(position % viewList.size());
            	container.removeView(viewList.get(position % viewList.size()));
            	view.setTag("remove");
            }  
            
            @Override  
            public Object instantiateItem(ViewGroup container, int position) 
            {
            	Log.d("", "instantiateItem called:" + position);
            	
            	View view = viewList.get(position % viewList.size());
            	if (view.getTag()== null || view.getTag().toString().equals("remove"))
            	{
            		Log.d("", "view added called:" + position + "    viewpos:" + position % viewList.size());
            		container.addView(view);
            		view.setTag("add");
            	}
                return view;
            }  
  
        };  
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
		{
			@Override
			public void onPageSelected(int arg0)
			{
				Log.d("", "onPageSelected called:" + arg0);
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2)
			{
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0)
			{
			}
		});
        viewPager.setAdapter(pagerAdapter);
        viewPager.setCurrentItem(page_size/2, false);
    }   
}

 备注:

1)循环ViewPager的实现思路主要是告诉adapter有一个很大的view数组,这里为5000,然后在View的创建和销毁的回调中检测Position,根据Position%Views.size()来确定实际要显示的View。

2)代码经过测试,发现在ViewPager有4个及以上的View时,可以正常使用。有3个及以下时,无法正常使用。后续需要仔细研究下。

发表评论

10 − 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据