原创 android之ViewPager的使用

2021-6-11 13:15 2501 14 14 分类: 软件与OS 文集: android studio

ViewPager是一个非常强大的 UI组件,应用非常广泛。它提供了多界面切换的效果,具体来说就是当前显示一组界面中的一个界面,当用户左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分,滑动结束后,界面自动跳转到当前选择的界面中。

下面用实例来说明如何使用。

和之前的其他控件一样,使用ViewPager也需要把ViewPager对应的控件加入布局文件中。在MainActivity对应的布局文件中添加 ViewPager 的代码如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. tools:context=".MainActivity">
  8. <androidx.viewpager.widget.ViewPager
  9. android:id="@+id/viewPager"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent"/>
  12. </RelativeLayout>

当完成布局文件之后,在Activity 文件中根据id获取 ViewPager。与使用ListView 相似,还需要一个适配器类来处理 ViewPager 的页面。

MainActivity 代码如下

  1. package com.rfstar.viewpager;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.viewpager.widget.ViewPager;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class MainActivity extends AppCompatActivity {
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. initView();
  15. }
  16. private void initView() {
  17. ViewPager viewPager=(ViewPager)findViewById(R.id.viewPager);
  18. LayoutInflater layoutInflater=getLayoutInflater();
  19. View firstView=layoutInflater.inflate(R.layout.first_page,null);//第一个页面
  20. View secondView=layoutInflater.inflate(R.layout.second_page,null);//第二个页面
  21. View thirdView=layoutInflater.inflate(R.layout.third_page,null);//第三个页面
  22. List<View> pages=new ArrayList<>();//创建一个集合来存放这三个页面
  23. pages.add(firstView);
  24. pages.add(secondView);
  25. pages.add(thirdView);
  26. ViewPagerAdapter viewPagerAdapter=new ViewPagerAdapter(pages);//创建适配器对象
  27. viewPager.setAdapter(viewPagerAdapter);//设置适配器
  28. }
  29. }

适配器代码如下:

  1. package com.rfstar.viewpager;
  2. import android.view.View;
  3. import android.view.ViewGroup;
  4. import androidx.annotation.NonNull;
  5. import androidx.viewpager.widget.PagerAdapter;
  6. import java.util.List;
  7. class ViewPagerAdapter extends PagerAdapter {
  8. private List<View> pagelist;
  9. public ViewPagerAdapter(List<View> list)
  10. {
  11. this.pagelist=list;
  12. }
  13. @Override
  14. public int getCount() {
  15. return pagelist.size();
  16. }
  17. @Override
  18. public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
  19. return view==object;
  20. }
  21. @Override
  22. public Object instantiateItem(ViewGroup container, int position)
  23. {
  24. container.addView(pagelist.get(position));
  25. return pagelist.get(position);
  26. }
  27. @Override
  28. public void destroyItem(ViewGroup container,int position,Object object)
  29. {
  30. container.removeView(pagelist.get(position));
  31. }
  32. }

Activity 中还涉及3View 页面

First_page.xml文件的代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:text="this is first page"
  9. android:textSize="30sp"/>
  10. </LinearLayout>

Second_page.xml代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:text="this is second page"
  9. android:textSize="30sp"/>
  10. </LinearLayout>

Third_page.xml代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:text="this is third page"
  9. android:textSize="30sp"/>
  10. </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 中,这是为了确保在 finishUpdateviewGroup)返回时已经完

成。此方法的返回值是一个代表新增视图页面的 ObjetKey),上述实例

中直接返回了视图本身。当然这里没必要非要返回视图本身,也可以是这个页面的其他容器,甚至是可以代表当前页面的任意值,只要可以与增加的 View 一一对应即可,比如 position 变量也可以作为 Key

destroyltem(ViewGroup container,in position, Object object)

移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为

了确保在 finishUpdateviewGroup)返回时视图能够被移除

isViewFromObject(View. Object)

用来判断 instantiateltem(ViewGroupint)方法所返回的Key 与一个页面视图代表的是否为同一个视图(判断两者是否对应,对应就表示同一个View)。

本实例中 instantiateltem(ViewGroupint)方法返回了视图本身,因为在此方法中使用视图与之比较,所以自然返回的是 true

另外,PagerAdapter支持数据集合的改变,数据集合的改变必须要在主线程里面执行,然后还要调用 notifyDataSetChanged方法。和BaseAdapter 非常相似。数据集合的改变包括页面的添加删除和修改位置。

android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。

作者: 大鸟科创空间, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3949041.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
14
关闭 站长推荐上一条 /2 下一条