android控件--ViewPager原理及实现

一、原理:

ViewPager是SupportV4的一个组件,主要是是一个可以实现一种卡片式的左右滑动的View容器。使用该类类似于ListView,需要用到自定义的适配器PagerAdapter,区别在于每次去获取一个View的方式。
ViewPager是一个页面容器,只是每一个页面都是整一屏幕,滑动屏幕的类似于卡片式的,目前微信5.1和多看整体都是用该方法浏览。



整个流程是ViewPager控件每一次翻动一次都去适配器实现类中去取得一个View,然后缓存一个该滑动方向的View。PagerAdapter的作用是让开发者自己实现取数据,将其填充自定义的单页View布局中,然后实现PagerAdaper的一些生命周期方法,返回View给ViewPager显示。通常用户数据都是列表,用List来存储,而数据项也是各种复杂对象,List可以当做PagerAdapter继承类的构造函数。


        ViewPager总是持有三个View实例,除了第一次,每次调用PagerAdapter的instantiateItem方法获取View实例的时候,传入的position都是当前页面的位置的向前一页,是为缓存一页,然后销毁掉后一项的后一项。初始化的过程是调用getCount()两次,初始化0,1项。用户翻页到1项,生成2项,此时一共有三项。之后,翻页到2项,销毁0项,生成三项。此时是1,2,3项,如图。


二、PagerAdapter重点接口:

PagerAdapter是个抽象类,需要继承实现其中的几个重要的方法:
1.getCount();一共有多少个Item
2.instantiateItem(View container, int position)实例化一个项目,也就是ViewPager对象从适配器接口中动态获取一个View,传入的是当前页码位置,与getCount()方法有关系。要从自定义的数据集合中取得对应的View
3.destroyItem(View container, int position, Object object) 使用ViewPager.remove方法
4.isViewFromObject 必须实现,其判断View是否是强转而来,传入的是View和Object,可以直接对其进行比较。系统在优化的过程中,会预先判读前后一页,进而在这进行判断是不是来自内存已有的
关于数据源:
PagerAdapter里使用的数据源也是来用户数据,通常使用ArrayList来承载数据项,每一项都是页面里对应的显示空间要承载的数据。类似于ListView的适配器baseAdapter一样。唯一的不同是在获取ListView控件取View是需要手动实现container.addView()方法来实现。通常是将数据List当做Adapter的构造函数传入。

三、实例:

使用过程:
1.在布局中增加一个ViewPager:
        在列表中找不到,只能用手写标签,可以在代码中先敲出来,让Eclipse自动导入完整包名,然后将其拷贝到布局的标签中。
        <android.support.v4.view.ViewPager
     android:id="@+id/pager"
     android:layout_width="match_parent"
     android:layout_height="200dp"
        />
2.在mainAcitivity中findViewByID找到ViewPager,setAdapter();需要一个参数,是PagerAdapter,新建一个内部类MyAdapter extends PagerAdapter,实现具体的方法。
   1.由于需要View作为Adatper的返回的页面,要制作一个layout布局文件,然后使用Activity的方法将其转换为View.在Layout中新建一个xml,带一个TextView标志一下,
      新建一个ArrayList<View view> = array,使用main的getLayoutInflater().inflate()方法将布局文件转换成View,循环做5个,添加到Arraylist中。
   2.实现getCount();
            return arraylist.size();
   3.实现intstantiateItem()方法
            从集合中arraylist.get(positon);取得View,然后将其加入到控件Viewpager的对象中,使用viewpager.addView();这是重点
    4.实现destroyItem
            从集合中取得View,使用viewpager.remove(view);方法
    5.最后实现的是isviewFormObject,使用两个参数的相等判断就可以了。


public class MainActivity extends Activity {
 private ViewPager viewPager;
 private PagerAdapter mMyAdapter = new MyAdapter();
 private ArrayList<View> arrayList;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  createAllItems();
  viewPager = (ViewPager) findViewById(R.id.pager);
  viewPager.setAdapter(mMyAdapter);
 }
 private void createAllItems() {
  // TODwwO Auto-generated method stub
  arrayList = new ArrayList<View>();
  for (int i = 0; i < 5; i++) {
   View view = getLayoutInflater().inflate(R.layout.pagerview_item,
     null);
   TextView tv = (TextView) view.findViewById(R.id.textView1);
   tv.setText("页面" + i);
   arrayList.add(view);
  }
 }
 class MyAdapter extends PagerAdapter {
  // 新建一个Item
  @Override
  public Object instantiateItem(View container, int position) {
   // TODO Auto-generated method stub
   View view = arrayList.get(position);
   viewPager.addView(view);//重点是这里。
   return view;
  }
  // 销毁一个item
  @Override
  public void destroyItem(View container, int position, Object object) {
   View view = arrayList.get(position);
   viewPager.removeView(view);
  }
  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   return arrayList.size();
  }
  @Override
  public boolean isViewFromObject(View arg0, Object arg1) {
   // TODO Auto-generated method stub
   return arg0 == arg1;
  }
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值