现在的位置: 首页 > 综合 > 正文

ViewPager,LayoutInflater实现页面滑动效果。

2014年02月21日 ⁄ 综合 ⁄ 共 3252字 ⁄ 字号 评论关闭

ViewPager是安卓开发中涉及页面滑动用到的类。位于android.support.v4.view.ViewPager包中。

首先做页面滑动效果。要现在xml文件中添加

<android.support.v4.view.ViewPager
        android:id="@+id/
viewpager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" > 
        </android.support.v4.view.ViewPager>

添加上之后要在Activity页面中获取:

ViewPager vp = (ViewPager)this.findViewById(R.id.viewpager)  ;

既然是页面之间进行滑动,大家应该能够想到我们需要添加几个页面来供我们滑动。

要做到这一步就要涉及到第二个类:LayoutInflater。

LayoutInflater是一个加载布局文件的类。我们平时加载布局文件就是通过setContentView(R.layout.activity_main);向当前Activity加载并显示出来。

其实我们还可以只加载布局但不显示出来。需要的时候再显示。这就是LayoutInflater类的作用。

使用LayoutInflater类加载页面的方式有三种:

1、

 LayoutInflater li= LayoutInflater.from(this);

View v1 = li.inflate(R.layout.view1,null);

2、

LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View v2 = li.inflate(R.layout.view2,null);

3、
LayoutInflater li = getLayoutInflater();

View v3 = li.inflate(R.layout.view3,null);
至于为什么有三种方法,以及他们之间的区别,我觉得没必要知道,其实我也不很清楚。不过推荐用第一种或者第二种方法。他们的实现源码好像是一样的,而第三种貌似好像是有一定得限制条件。总之我的习惯是用第一种。这个不重要,继续加载我们要滑动的页面。

把需要加载的页面全部放到一个list里面:

final ArrayList<View> views = new ArrayList<View>();

views.add(v1);
views.add(v2);
views.add(v3);
views.add(v4);

这样我们把滑动用到的界面都拿到了并放到了一个叫做views的list里面。再回去看ViewPager类。

这时我们有了可以滑动页面的类vp,和需要滑动的一些页面在views里面。但是这还不够。这就好比我们有了机器,有了原料。但是它不能自动加工我们需要把原料放到机器里面。这就是PagerAdapter。别人都叫他做适配器。

这个类似于ListView的SimpleAdapter,用来把数据指定到View中。PagerAdapter就是把页面放到ViewPager中供其滑动。

PagerAdapter myPagerAdapter = new PagerAdapter() {

@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 Object instantiateItem(View container, int position) {
((ViewPager)container).addView(views.get(position));
return views.get(position);
}
};

上面就是声明一个适配器对象。里面的三个方法都是必须的。

第一个应该看public Object instantiateItem(View container, int position)这个方法。因为这个是初始化的。也就是滑动效果显示的第一个页面。

先把container强制转化成(ViewPager)类型之后向里面addView(views.get(position))。这就和我们装载页面的list联系上了,并且初始化的时候positiion会是0.至于为什么会是0我也弄不明白。还请大神指正。

然后看public void destroyItem(View container, int position, Object object)这个方法指的是当滑动页面的时候要吧前面一个页面在容器中删除再去加载滑近来的页面。

至于这个public int getCount()方法,看里面的代码应该知道这是获取页面总量的。

最后再看public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}

这个方法。大家都是说是否页面和对象有关联。我感觉也是这么个意思。但具体哪个页面跟哪个对象关联 我也闹不清。不过不用着急。我发现大多数方法里的内容都是这句话:return arg0 == arg1;   如果不明白照做就是了。

最后我们再为我们的ViewPager添加上这个适配器

vp.setAdapter(myPagerAdapter);

至此在理论上应该可以出现滑动页面的效果了。

另外ViewPager类还是又其他方法可以使用的。例如ViewPager.setCurrentItem(index);就是设置当前页面为views列表中的第几个页面。(用于选择页面,类似于qq最下面的几个按钮。)

然后在滑动页面时我们常见的功能还有对滑动页面的监听,进而完成后台相应动作。这就是ViewPager类的setOnPageChangeListener(OnPageChangeListenerlistener)方法。

我们可以通过实现OnPageChangeListener接口来写自己的OnPageChangeListener类。

OnPageChangeListener接口中有

@Override
public void onPageSelected(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}

这三个默认的方法。
onPageSelected(int arg0){  }

这个方法里面的内容是页面跳转完毕之后执行的。
arg0是表示你当前选中的页面,这事件是在你页面跳转完毕的时候调用的。

public void onPageScrollStateChanged(int arg0) {} 

这个方法应该是滑动过程中执行的内容。

arg0 ==1的时候表示正在滑动,arg0==2的时候表示滑动完毕了,arg0==0的时候表示什么都没做,就是停在那。

public void onPageScrolled(int arg0, float arg1, int arg2) {}

表示在前一个页面滑动到后一个页面的时候,在前一个页面滑动前调用的方法。

【上篇】
【下篇】

抱歉!评论已关闭.