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条评论)
登录后参与讨论