最近做了一个图片轮播,记录自己的学习过程,避免遗忘
viewpager的简单介绍
Viewpager,视图翻页工具,提供了多页面切换的效果。Android 3.0后引入的一个UI控件,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的APP一般不再兼容3.0及以下的系统版本,另外现在大多数使用Android studio进行开发,默认导入v7包,v7包含了v4,所以不用导包,越来越方便了。Viewpager使用起来就是我们通过创建adapter给它填充多个view,左右滑动时,切换不同的view。在新版本的Android studio中更新了一个androidx的包,可以在直接使用,无需再导包。
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要一一对应的关系。
未完