ViewPager的介绍和使用

一.ViewPager简介

ViewPger就是将多个View引用到Adapter中,在左右滑动时,切换不同的View视图

我们日常app中经常用到的滑动换页,大部分就是用它做的

ViewPager 直接继承了 ViewGroup,所以它是一个容器类,可以在其中添加其他的 view 类。
ViewPager 需要一个 PagerAdapter 适配器类给它提供数据。
ViewPager 经常和 Fragment 一起使用,并且提供了专门的 FragmentPagerAdapter 和 FragmentStatePagerAdapter 类供 Fragment 中的 ViewPager 使用。

二.ViewPager使用

1.在布局文件中引用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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">

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

</LinearLayout>

2.创建要加载的ViewPager布局文件

<?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:gravity="center"
    android:orientation="vertical">
    <TextView
        android:id="@+id/text_show"
        android:text="12456"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

3.创建适配器,自定义布局设置数据等

public class MyAdapater extends PagerAdapter {
    private Context context;
    private List<String> datas;

    private LayoutInflater layoutInflater;

    public MyAdapater(Context context, List<String> datas) {
        this.context = context;
        this.datas = datas;
        this.layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return datas.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
        return view == o;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
//        super.destroyItem(container, position, object);必须删除,否则报错
        container.removeView((View) object);
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        View view = layoutInflater.inflate(R.layout.vp_layout, null);
        TextView text = view.findViewById(R.id.text_show);
        text.setText(datas.get(position));
        container.addView(view);//添加布局(***)
        return view;
    }
}

destroyItem()方法中的super()一定要删除,否则报错
instantiateItem()方法中,一定要将解析的View加入到视图组container中>

4.在Activity中添加数据,以及要完成的各种操作

public class MainActivity extends AppCompatActivity {
    private ViewPager vp;
    private MyAdapater myAdapater;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }


    private void initViews() {
        vp = (ViewPager) findViewById(R.id.vp);

        List<String> datas = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            datas.add("第" + (i+1) + "个View");
        }

        myAdapater = new MyAdapater(MainActivity.this, datas);
        vp.setAdapter(myAdapater);
    }
}

效果展示
在这里插入图片描述

三.翻页监听

其中有三个方法

onPageSelected,onPageSelected,onPageScrollStateChanged

  1. onPageScrolled:在屏幕滑动过程中被调用。
  2. onPageSelected:代表哪个页面被选中。
  3. onPageScrollStateChanged:在手指操作屏幕时被调用。

第三个方法的参数
state:当前页面的状态
SCROLL_TATE_IDLE:空闲状态
SCROLL_STATE_DRAGGING:滑动状态
SCROLL_STATE_SETTLING:滑动后滑翔的状态

setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int i, float v, int i1) {

    }

    @Override
    public void onPageSelected(int i) {
        
    }

    @Override
    public void onPageScrollStateChanged(int i) {

    }
})

四.ViewPager与Fragment的结合使用

1.与Fragment结合使用就相当于用Fragment去替代之前的View
2.Fragment的Adapter有两种:
FragmentPagerAdapterFragmentStatePagerAdapter
两种适配器都是继承了PagerAdapter

适配器与Fragment的生命周期:

1.FragmentStatePagerAdapter
fragment的生命周期会执行
onDestoryView
onDestory
onCreate
onCreateView
fragment会被销毁
适用 图片预览等多个fragment的情况
2.FragmentPagerAdapter
onDestoryView
onCreateView
fragment不会被销毁
适用于引导页等少个fragment的情况

四.案例

一个小案例:需要实现
三个Fragment,其中1和2随意,第3个Fragment需要实现倒计时5秒功能,倒计时后跳转到另一个Activity或一个按钮在按下时直接跳转到另一个Activity

首先创建三个Fragment及其布局文件,由于1和2里仅有一个图片做展示,所以只展示第三个Fragment的代码及布局文件

public class ThreeFragment extends Fragment {


    public ThreeFragment() {
        // Required empty public constructor
    }


    private static TextView teTime;
    private Button butGo;
    private static Timer timer;
    private static int index = 5;
    private static Context context;

    public static Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        handler.sendEmptyMessage(2);
                    }
                }, 0, 1000);
            } else if (msg.what == 2) {
                teTime.setText("" + --index);
                if (index == 0) {
                    context.startActivity(new Intent(context, MainActivity.class));
                }
            }
        }
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_three, container, false);
        initViews(view);

        context = getActivity();//赋值上下文对象
        return view;
    }

    private void initViews(View view) {
        teTime = (TextView) view.findViewById(R.id.te_time);
        butGo = (Button) view.findViewById(R.id.but_go);

//        new Thread() {
//            int index = 5;
//
//            @Override
//            public void run() {
//                for (int i = 0; i < 5; i++) {//设置5秒
//                    handler.post(new Runnable() {
//                        @Override
//                        public void run() {
//                            teTime.setText("" + index);
//                        }
//                    });
//                    try {
//                        Thread.sleep(1000);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    index--;
//                    if (index <= 0) {
//                        startActivity(new Intent(getActivity(), MainActivity.class));
//                    }
//                }
//            }
//        }.start();

        butGo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getActivity(), MainActivity.class));
                timer.cancel();//取消定时器任务
            }
        });
    }

}

在其中定义的handler,是用来判断页面是否滑动到第三个Fragment,及之后的倒计时操作

不可直接做子线程进行倒计时操作,因为在滑动到与其相邻的页面时,当前页面也会随之创建,这会导致页面没有滑动到第三个Fragment时,倒计时就已经开始

由于Fragment不能直接调用startActivity()方法,所以在一开始就定义了成员变量的上下文对象并进行赋值

在按按钮的时候,需要将倒计时任务取消,否则会发生第二次跳转

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".test.ThreeFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >

        <TextView
            android:layout_marginLeft="220dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="倒计时:"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/te_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="XXX"
            android:textSize="20sp" />

        <Button
            android:id="@+id/but_go"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="跳过" />
    </LinearLayout>

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/a" />


</LinearLayout>

Activity中的代码及布局文件

public class WelActivity extends AppCompatActivity {
    private ViewPager vp;
    private List<Fragment> datas = new ArrayList<>();
    private Mydapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wel);

        initDatas();
        initViews();
    }

    private void initDatas() {
        datas.add(new OneFragment());
        datas.add(new TwoFragment());
        datas.add(new ThreeFragment());
    }

    private void initViews() {
        vp = (ViewPager) findViewById(R.id.vp);
        myAdapter = new Mydapter(getSupportFragmentManager(), datas);
        vp.setAdapter(myAdapter);

        vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int i) {
                if (i == datas.size() - 1) {
                    ThreeFragment.handler.sendEmptyMessage(1);
                }
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });
    }
}

在Activity中给ViewPager设置了监听事件
onPageSelected()方法中判断是否滑动到第三个Fragment,然后调用Fragment中的静态handler发送空消息来开启倒计时操作

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".test.WelActivity">

    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

</LinearLayout>

适配器中的代码
其中的List的泛型是Fragment

public class Mydapter extends FragmentPagerAdapter {
    private List<Fragment> datas;

    public Mydapter(FragmentManager fm, List<Fragment> datas) {
        super(fm);
        this.datas = datas;
    }

    @Override
    public Fragment getItem(int i) {
        return datas.get(i);
    }

    @Override
    public int getCount() {
        return datas.size();
    }
}

最后进行效果展示(图片是我女神)

在这里插入图片描述

在这里插入图片描述
要开心加油

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您讲解关于AndroidViewPager和Fragment的使用ViewPager和Fragment是Android中非常常用的组件,他们可以一起使用来实现滑动页面效果。ViewPager是一个可以左右滑动切换页面的布局容器,而Fragment作为ViewPager的子页面,可以在ViewPager中进行动态添加和移除。 下面我们将分别介绍ViewPager和Fragment的使用。 ## ViewPager的使用 ### 1.布局文件 在布局文件中,我们需要使用ViewPager作为容器,将需要滑动切换的页面放入其中。如下所示: ``` <androidx.viewpager.widget.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` ### 2.创建Adapter 我们需要创建一个Adapter继承自PagerAdapter,并重写以下方法: ``` public class MyPagerAdapter extends PagerAdapter { private List<Fragment> mFragments; public MyPagerAdapter(List<Fragment> fragments) { mFragments = fragments; } @Override public int getCount() { return mFragments.size(); } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { Fragment fragment = mFragments.get(position); container.addView(fragment.getView()); return fragment.getView(); } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); } } ``` ### 3.设置Adapter 在Activity或Fragment中,我们需要创建ViewPager的实例,并设置Adapter。如下所示: ``` ViewPager viewPager = findViewById(R.id.viewPager); List<Fragment> fragments = new ArrayList<>(); fragments.add(new Fragment1()); fragments.add(new Fragment2()); fragments.add(new Fragment3()); MyPagerAdapter adapter = new MyPagerAdapter(fragments); viewPager.setAdapter(adapter); ``` 这样,我们就完成了ViewPager的使用。 ## Fragment的使用 ### 1.创建Fragment 我们需要创建一个继承自Fragment的类,并重写以下方法: ``` public class Fragment1 extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1, container, false); return view; } } ``` ### 2.布局文件 我们需要在Fragment中添加布局文件,如下所示: ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Fragment1" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> ``` 这样,我们就完成了Fragment的使用。 ## ViewPager和Fragment的结合使用 通过以上介绍,我们已经知道了如何使用ViewPager和Fragment了。现在我们需要将它们结合起来使用。 ### 1.创建Fragment 我们需要创建多个Fragment作为ViewPager的子页面。 ### 2.创建Adapter 我们需要创建一个PagerAdapter,将Fragment添加到ViewPager中。如上所示,我们已经创建了一个MyPagerAdapter。 ### 3.设置Adapter 在Activity或Fragment中,我们需要创建ViewPager的实例,并设置Adapter。如上所示,我们已经使用ViewPager的setAdapter方法设置了MyPagerAdapter。 这样,我们就完成了ViewPager和Fragment的结合使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值