1 . Viewpager 划动 :
使用viewpager实现划动很容易,只需要设置简单是适配器即可,
/**
* 划动适配器
* @author Administrator
*
*/
class MyPagerAdapter extends PagerAdapter{
public ArrayList<View> views; //数据集合
public MyPagerAdapter (ArrayList<View> views){
this.views = views;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public int getCount() {
return views.size();
}
@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager)container).removeView(views.get(position));
}
@Override
public CharSequence getPageTitle(int position) {
// 返回每个划动页面的标示 这里 用页面上一个控件来标注
View v = views.get(position);
TextView t = (TextView) v.findViewById(R.id.xct_lthj_quot_exch_exch_tv_asset);
return t.getText().toString();
}
@Override
public Object instantiateItem(View container, int position) {
((ViewPager)container).addView(views.get(position));
return views.get(position);
}
}
viewpager = findviewbyid(R.id.xxxxxxxxxx);
//设置划动数据适配器
viewpager.setAdapter(new MyPagerAdapter(viewPagerSubViews));
仅依靠以上代码 即可实现页面的划动,如果有需求实现循环划动则需要对viewpager设置OnPageChangeListener监听器,并根据一套算法
来控制 viewpager的显示页。
2. 循环划动
首先要确定viewpager数据集合中的元素是否 是变化的。这里说的是 数据固定的情况。
当确定数据集合后 ,就可以通过设置OnPageChangeListener 监听器来 控制当前显示的 页面或者下个显示的页面,
这里首先举例 说明 有3个页面要显示的情况:
例如:要显示3个划动页面 “人民币(索引是0)” “港币(索引是1)” “美元(索引是2)” 。
//当划动的索引 是0时 ,修改当前索引到倒数第二个(length-2)
//当划动的索引是最后一个时,修改当前索引到正数第二个
由此总结出 规律:
private class MyOnPageChangeListener implements OnPageChangeListener {
@Override
public void onPageSelected(final int position) {
/* switch (position) {
case 0:
Log.i("info", position+"美元");
break;
case 1:
Log.i("info", position+"人民币");
break;
case 2:
Log.i("info", position+"港币");
break;
case 3:
Log.i("info", position+"美元");
break;
case 4:
Log.i("info", position+"人民币");
break;
case 5:
Log.i("info", position+"港币");
break;
}*/
// 当前页为0时改为倒数第二个,也就是实际需要的最后一个view;当前页为最后一个时改为第二个,即实际上的第一个view
// 按照数据集合来参照(从0开始):
//当划动的索引 是0时 ,修改当前索引到倒数第二个(length-2)
//当划动的索引是最后一个时,修改当前索引到正数第二个
int showIndex = position;
if (position == 0) {
showIndex = viewPagerSubViews.size() /2/*- 3*/;
viewpager.setCurrentItem(viewPagerSubViews.size() /2 /*- 3*/, false);
} else {
if (position == viewPagerSubViews.size() - 1) {
showIndex = viewPagerSubViews.size() /2-1/*2*/;
viewpager.setCurrentItem(showIndex, false);
}
}
/* MyPagerAdapter p = (MyPagerAdapter) viewpager.getAdapter();
String strTag = (String) p.getPageTitle(showIndex);
*/
if(viewPagerSubViews.size()>1){
rg.check((showIndex+(viewPagerSubViews.size()/2-1))%(viewPagerSubViews.size()/2));
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
}
// 由以上算法 可以认识到:数据集合需要是要显示的数据的2倍 ,例如如果有3个页面循环划动,那么数据集合 就得有6个。
此外 数据集合中的元素排列也不一样,例如 有三个页面循环划动,并且以人民币,港币,美元的顺序划动,那么6个元素中 排列顺序如下:
从第二个开始排列要首先显示的数据: 因此 0-5的索引中 1则为人民币, 并 以此顺序往后排,
1:人民币
2:港币
3:美元
4 :人民币
5:港币
到这里还剩下 一个美元 ,把美元排到0的位置 ,就成了
0:美元
1:人民币
2:港币
3:美元
4:人民币
5:港币
在根据以上算法 就可以循环划动 (左右划动)
3:导航点
如果要有导航点 ,则只需要在布局文件里加入 一组存放 导航图片的控件即可。这里选用 RadioGroup
RadioGroup rg = findviewbyid(R.id....);
只需要一个简单的 算法 并 对RadioGroup的子元素(RadioButton)设置层列表图形资源 即可实现导航点.
当划动 页面时 ,在 监听器的onPageSelected中 控制 radiobutton的选中项
if(viewPagerSubViews.size()>1){
rg.check((showIndex+(viewPagerSubViews.size()/2-1))%(viewPagerSubViews.size()/2));
}