ViewPager使用方法

转载请注明链接:https://blog.csdn.net/feather_wch/article/details/79494748

讲解ViewPager的使用方法,包括ViewPager做启动页面(加载一般的View),以及ViewPager+Fragment实现多个Fragment左右滑动切换的功能。

ViewPager使用方法

版本:2018/8/27-1


1、ViewPager是什么?

  1. ViewPager是android扩展包v4包中的类,这个类可以让我们左右切换当前的view。

2、ViewPager的特点

  1. ViewPager类直接继承了ViewGroup类,因此它一个容器类,可以添加其他的view类
  2. ViewPager类需要一个PagerAdapter适配器类给它提供数据(类似于ListView所需要数据适配器Adater)
  3. ViewPager经常和Fragment一起使用,并且官方还提供了专门的FragmentPagerAdapter和FragmentStatePagerAdapter类供Fragment中的ViewPager使用

3、ViewPager启动页面的实现方法

  1. 自定义多个启动页面的布局-layout_tab1,layout_tab2,layout_tab3等
//layout_tab1
<?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:orientation="vertical"
    android:background="@color/colorAccent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="tab1"/>
</LinearLayout>
//layout_tab2等类似
......
  1. Activity的布局
//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="com.example.a6005001819.androiddeveloper.MainActivity">

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

</android.support.constraint.ConstraintLayout>
  1. 继承并实现PagerAdapter中的方法,并且在Activity中使用
//MainActivity.java
package com.example.a6005001819.androiddeveloper;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

import java.util.ArrayList;

public class MainJavaActivity extends Activity implements BlankFragment.onFragmentInteractionListerner{

    ArrayList<View> viewContainter = new ArrayList<View>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_java);
        //1. 将View视图都存入列表中
        View view1 = LayoutInflater.from(this).inflate(R.layout.layout_tab1, null);
        View view2 = LayoutInflater.from(this).inflate(R.layout.layout_tab2, null);
        View view3 = LayoutInflater.from(this).inflate(R.layout.layout_tab3, null);
        viewContainter.add(view1);
        viewContainter.add(view2);
        viewContainter.add(view3);
        //2. 给ViewPager设置适配器
        ViewPager viewPager = findViewById(R.id.main_viewpager);
        viewPager.setAdapter(new MyPagerAdapter());
    }

    /**
     * 3. 自定义适配器,需要实现下面的"四个方法"
     */
    public class MyPagerAdapter extends PagerAdapter {
        //1. 返回可以滑动的View的个数
        @Override
        public int getCount() {
            return viewContainter.size();
        }
        //2. 滑动切换时销毁当前View
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView(viewContainter.get(position));
        }
        //3. 将当前View添加到父容器中,并且返回当前View
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            container.addView(viewContainter.get(position));
            return viewContainter.get(position);
        }
        //4. 确认"第三步"instantiateItem返回的Object与页面View是否是同一个
        @Override
        public boolean isViewFromObject(View view, Object object) {
            //5. 官方推荐直接 `view == object`
            return view == object;
        }
    }
}

4、PagerTitleStrip类和PagerTabStrip类(不推荐使用)

  1. 作用:用于设置每页的标题
  2. 缺点: 标题会随着页面滑动,建议使用自定义的指示器

ViewPager+Fragment

5、FragmentPagerAdapter与FragmentStatePagerAdapter

  1. 用于Fragment需要两个特殊的适配器FragmentPagerAdapterFragmentStatePagerAdapter
  2. FragmentPagerAdapter会将每个生成的Fragment都保存在内存中,适合相对静态,数量较少的情况
  3. FragmentStatePagerAdapter适合数据动态,页面数量较多,占用内存多的情况

6、FragmentPagerAdapter与FragmentStatePagerAdapter的使用

  1. 直接继承不同Adpater即可,内部代码完全一致。
  2. FragmentStatePagerAdapter会根据Fragment状态去销毁不是当前页面的Fragment,从而节约内存。
     public class MyFragmentPagerAdapter extends FragmentPagerAdapter{
        List<Fragment> fragmentList;
        public MyFragmentPagerAdapter(android.support.v4.app.FragmentManager fm, List<Fragment> list) {
            super(fm);
            fragmentList = list;
        }
        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }
        @Override
        public int getCount() {
            return fragmentList.size();
        }
    }
    public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter{
        List<Fragment> fragmentList;
        public MyFragmentStatePagerAdapter(android.support.v4.app.FragmentManager fm, List<Fragment> list) {
            super(fm);
            fragmentList = list;
        }
        @Override
        public Fragment getItem(int position) {
            return fragmentList.get(position);
        }
        @Override
        public int getCount() {
            return fragmentList.size();
        }
    }

7、实现ViewPager+Fragment的滑动

  1. 实现需要加载的各种Fragment,实现方法不赘述
  2. Activity中进行加载,且该Activity必须继承自FragmentActivity
//MainActivity.java
//1、新建Fragment存入链表
ArrayList<Fragment> list = new ArrayList<>();
list.add(new Fragment1());
list.add(new Fragment2());
//2、ViewPager设置适配器
ViewPager viewPager = findViewById(R.id.main_viewpager);
viewPager.setAdapter(new MyFragmentStatePagerAdapter(getSupportFragmentManager(), list));

参考资料

  1. ViewPager系列教学
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值