viewpager的学习笔记

viewpager的学习


最近做了一个图片轮播,记录自己的学习过程,避免遗忘

viewpager的简单介绍
Viewpager,视图翻页工具,提供了多页面切换的效果。Android 3.0后引入的一个UI控件,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的APP一般不再兼容3.0及以下的系统版本,另外现在大多数使用Android studio进行开发,默认导入v7包,v7包含了v4,所以不用导包,越来越方便了。Viewpager使用起来就是我们通过创建adapter给它填充多个view,左右滑动时,切换不同的view。在新版本的Android studio中更新了一个androidx的包,可以在直接使用,无需再导包。

viewpager的三种适配器的继承关系viewpager的三种适配器的继承关系

适配器采用MVC模式:

所谓的MVC,就是M:model ; V: View ; C:Controller

MVC模式的使用实现了数据与前端的分离,数据源与试图互不干扰

创建视图适配器的一般步骤:

1、创建承载数据的视图容器

2、创建数据源

3、创建适配器并把数据绑定在适配器

4、将适配器绑定在视图容器

一个很简单的 对viewpager功能实现
xml

// 主界面的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >


    <androidx.viewpager.widget.ViewPager//可以在控件里直接搜索viewpager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>


</RelativeLayout>

紧接着创建三个不同的布局文件,用做视图。很简单,只贴一个的代码

// 创建时文件名分别设为view1,view2,view3  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffff00"//用不同的颜色填充界面来分辨不同的视图
    android:orientation="vertical">


</LinearLayout>;

java
首先声明变量

private View va, vb, vc;//对应在上面创建的三个不同layout文件
private ViewPager viewPager;
private List<View> viewlist;//数组,盛放上面的三个视图

再进行初始化

//将资源与变量联系起来布局,最后将实例化的va,vb,vc添加到viewList中

viewPager =(ViewPager) findViewById(R.id.viewpager); 
      
LayoutInflater inflater=getLayoutInflater();


view1 =inflater.inflate(R.layout.view1, null);
view2 =inflater.inflate(R.layout.view2,null);
view3 =inflater.inflate(R.layout.view3, null);   

viewList = new ArrayList<View>(); //将要分页显示的View装入数组中
viewList.add(va);
viewList.add(vb);
viewList.add(vc);

这里使用的是Layoutiinflater, 一个布局服务, 就是一个视图的填充器。当XML布局资源被解析并转换成View对象时所使用。这里直接从activity中获取。

View的获取有两种方式 这也是其中一种 三种参数1 布局的资源id , 2 root填充的根视图, 3 是否将视图放到文件里面 这里将这个root的参数直接设为空 就省略了第三个参数 我们不需要判断是否需要绑定到这个根视图里面 功能必须要实现的 但是在其他地方使用的话 就要注意如果这个设为空 他的个体设置的高和宽就不能实现 设为空后就没有父布局。

选用pageradapter时所需要重写的四种方法

//首先创建一个适配器继承这个对应的pageradpter
 PagerAdapter pagerAdapter = new PagerAdapter() {
        @Override
        public boolean isViewFromObject(View view, Object object) {

            return view == object;//我们直接这样写就可以了


        }

决定一个页面view是否与instantiateItem(ViewGroup, int)方法返回的具体key对象相关联,就是这个object 。viewpager不直接处理每一个视图而是将各个视图与一个键联系起来。这个比较复杂,有资料是说ViewPager中有个存储view状态信息的ArrayList,根据View取出对应信息

        @Override
        public int getCount() {

            return viewlist.size();
        }

返回要滑动的VIew的个数 viewpager有几个页面

        @Override
        public void destroyItem(ViewGroup container, int position,
                                Object object) {
            container.removeView(viewlist.get(position));
        }

销毁页面 ,移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了确保 在finishUpdate(viewGroup)返回时视图能够被移除。当前container中删除指定位置(position)的View

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(viewlist.get(position));
            return viewlist.get(position)}
    };
    viewPager.setAdapter(pagerAdapter);

将给定位置的view添加到ViewGroup(容器)中,创建并显示出来 ;返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以了, 当然你也可以自定义自己的key,但是key和每个view要一一对应的关系。

未完

发布了1 篇原创文章 · 获赞 4 · 访问量 43

猜你喜欢

转载自blog.csdn.net/spikeee/article/details/104858119