ViewPager是一个非常强大的 UI组件,应用非常广泛。它提供了多界面切换的效果,具体来说就是∶当前显示一组界面中的一个界面,当用户左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分,滑动结束后,界面自动跳转到当前选择的界面中。
下面用实例来说明如何使用。
和之前的其他控件一样,使用ViewPager也需要把ViewPager对应的控件加入布局文件中。在MainActivity对应的布局文件中添加 ViewPager 的代码如下∶
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity">
- <androidx.viewpager.widget.ViewPager
- android:id="@+id/viewPager"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
- </RelativeLayout>
当完成布局文件之后,在Activity 文件中根据id获取 ViewPager。与使用ListView 相似,还需要一个适配器类来处理 ViewPager 的页面。
MainActivity 代码如下∶
- package com.rfstar.viewpager;
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.viewpager.widget.ViewPager;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import java.util.ArrayList;
- import java.util.List;
- public class MainActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initView();
- }
- private void initView() {
- ViewPager viewPager=(ViewPager)findViewById(R.id.viewPager);
- LayoutInflater layoutInflater=getLayoutInflater();
- View firstView=layoutInflater.inflate(R.layout.first_page,null);//第一个页面
- View secondView=layoutInflater.inflate(R.layout.second_page,null);//第二个页面
- View thirdView=layoutInflater.inflate(R.layout.third_page,null);//第三个页面
- List<View> pages=new ArrayList<>();//创建一个集合来存放这三个页面
- pages.add(firstView);
- pages.add(secondView);
- pages.add(thirdView);
- ViewPagerAdapter viewPagerAdapter=new ViewPagerAdapter(pages);//创建适配器对象
- viewPager.setAdapter(viewPagerAdapter);//设置适配器
- }
- }
适配器代码如下:
- package com.rfstar.viewpager;
- import android.view.View;
- import android.view.ViewGroup;
- import androidx.annotation.NonNull;
- import androidx.viewpager.widget.PagerAdapter;
- import java.util.List;
- class ViewPagerAdapter extends PagerAdapter {
- private List<View> pagelist;
- public ViewPagerAdapter(List<View> list)
- {
- this.pagelist=list;
- }
- @Override
- public int getCount() {
- return pagelist.size();
- }
- @Override
- public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
- return view==object;
- }
- @Override
- public Object instantiateItem(ViewGroup container, int position)
- {
- container.addView(pagelist.get(position));
- return pagelist.get(position);
- }
- @Override
- public void destroyItem(ViewGroup container,int position,Object object)
- {
- container.removeView(pagelist.get(position));
- }
- }
在Activity 中还涉及3个 View 页面
First_page.xml文件的代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="this is first page"
- android:textSize="30sp"/>
- </LinearLayout>
Second_page.xml代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="this is second page"
- android:textSize="30sp"/>
- </LinearLayout>
Third_page.xml代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="this is third page"
- android:textSize="30sp"/>
- </LinearLayout>
运行程序,然后滑动页面,当页面滑动到一半时效果如图1-1所示,当滑动完成时效果如图 1-2 所示。
1-1
1-2
在上例中,主要部分有两处,一处是initView()方法,一处是适配器类。
在initView()方法中通过 findViewByld()方法获取了ViewPager,然后通过LayoutInflater类获取布局文件,使用 Iist存储这3个布局文件对应的View,再将list传入ViewPageAdapter这个适配器中,再用 ViewPager类的setAdapterO方法让ViewPagerAdpter设置为它的适配器。这个过程和ListView的过程非常相似。
对于适配器,想必大家都不陌生,在ListView中也有适配器,listView通过重写 getView()函数来获取当前要加载的item,但是这里面的适配器 ViewPagerAdapter类和 ListView的适配器可能不太相同。
通过借助上面的实例,我们知道要实现一个 PagerAdapter适配器至少需要覆盖以下四个方法
getCount()
返回要滑动的 View 个数
instantiateltem(ViewGroup container,int position)
创建指定位置的页面视图。适配器有责任增加即将创建的 View 视图到给定的 container 中,这是为了确保在 finishUpdate(viewGroup)返回时已经完
成。此方法的返回值是一个代表新增视图页面的 Objet(Key),上述实例
中直接返回了视图本身。当然这里没必要非要返回视图本身,也可以是这个页面的其他容器,甚至是可以代表当前页面的任意值,只要可以与增加的 View 一一对应即可,比如 position 变量也可以作为 Key
destroyltem(ViewGroup container,in position, Object object)
移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为
了确保在 finishUpdate(viewGroup)返回时视图能够被移除
isViewFromObject(View. Object)
用来判断 instantiateltem(ViewGroup,int)方法所返回的Key 与一个页面视图代表的是否为同一个视图(判断两者是否对应,对应就表示同一个View)。
本实例中 instantiateltem(ViewGroup,int)方法返回了视图本身,因为在此方法中使用视图与之比较,所以自然返回的是 true
另外,PagerAdapter支持数据集合的改变,数据集合的改变必须要在主线程里面执行,然后还要调用 notifyDataSetChanged方法。和BaseAdapter 非常相似。数据集合的改变包括页面的添加删除和修改位置。
android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。
文章评论(0条评论)
登录后参与讨论