Google的扩展包android-support-v4.jar为我们提供了一个可以水平左右滚动的效果。到这篇完成的时间为止没能提供一个有效的可以左右循环滚动的方法。这里和大家做一个分享。希望对诸位有所帮助。
首先这个类是有API的地址为:http://developer.android.com/reference/android/support/v4/view/ViewPager.html
即便了解一下API对于开发非常有效果。因为了解之后一般的效果可以拼凑出来
下面是循环滚动(loop)的主要内容
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initList(); mBtn1 = (Button)findViewById(R.id.btn1); mBtn2 = (Button)findViewById(R.id.btn2); mBtn1.setOnClickListener(this); mBtn2.setOnClickListener(this); mPager = (ViewPager)findViewById(R.id.pager); pagerAdapter = new pagerAdapter(); mPager.setAdapter(pagerAdapter); mPager.setOnPageChangeListener(new pagerChangeListener()); mPager.setCurrentItem(firtstElementId);
ViewPager可ListView类似,需要一个适配器(PagerAdapter)承载数据和一个事件监听(OnPageChangeListener)
setCurrentItem(int index)方法主要用来制定初始化的页面。例如加入3个页面通过setCurrentItem(0)制定第一个页面为当前页面
final class pagerAdapter extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, int position) { View tv = null; if (isNotChange) { tv = pagerData.get(position); } else { tv = pagerData.get(lastElementId - position); } ((ViewPager)container).addView(tv); return tv; } @Override public int getCount() { return pagerData.size(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View)object); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == (arg1); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } }
这里是适配器pagerData放入的是2个ListView。instantiateItem方法在页面需要更新的时候放入相应的ListView
这里可以改用ListAdapter这样只需要切换ListAdapter就更方便了。本例为ListView
getItemPostion这里请设置为POSITION_NONE这个常量是Viewpage包内的
final class pagerChangeListener implements OnPageChangeListener { private int state = 0; @Override public void onPageScrollStateChanged(int state) { this.state = state; } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { if (!ENABLE_LOOP) return; if (arg1 + arg2 == 0) { if (state == ViewPager.SCROLL_STATE_DRAGGING && arg0 == firtstElementId) { isNotChange = !isNotChange; pagerAdapter.notifyDataSetChanged(); mPager.setCurrentItem(lastElementId, false); } else if (state == ViewPager.SCROLL_STATE_DRAGGING && arg0 == lastElementId) { isNotChange = !isNotChange; pagerAdapter.notifyDataSetChanged(); mPager.setCurrentItem(firtstElementId, false); } } } @Override public void onPageSelected(int arg0) { } }
这里是事件的处理,当画面移动开始,移动中,移动停止都有相应的状态。这里在手指滑动时判断是否遇到边界。边界就是指不能循环滚动情况下的最后一页。遇到它之后立刻改变数据形式。将最后一页变成第一页。并且将画面切换到相应页面上这里使用了
setCurrentItem(firstElementId,false)这个方法,作用是切换页面,不显示动画效果。true为显示动画
pagerAdapter.notifyDataSetChanged()方法触发instantiateItem方法改变数据结构。
onPageSelected(int arg0)方法,有的应用需要Head部分有指示器的。当页面切换完毕后。这里获取页面id
A B (初始化A B) 当前B状态下继续往右滑动
A->(B->A)(改变数据为B A结构)这样就又可以翻页了。
下面是完整代码。推荐使用2.2以上环境UTF-8编码。注意没有导入jar包的要导入。并且Viewpager jar包是有版本的。
ViewPager.rar