ViewPager的创建与使用

应用场景

引导界面,相册多图片预览

多Tab页面,App导航

广告播放展示

android.support.v4.view.ViewPager已过时

android.support.v4.view.ViewPager的地方改成androidx.viewpager.widget.ViewPager就可以了

最简单ViewPager

首先创建存放视图的集合

private List<View> mViews= new ArrayList<>();

(选做)用一个int数组存放资源

private int [] mLayoutIDs={R.layout.view_first,R.layout.view_second,R.layout.view_thrid};

将资源放入集合中

for (int index = 0; index <3 ; index++) {
    View view = getLayoutInflater().inflate(mLayoutIDs[index], null);
    mViews.add(view);
}

创建PagerAdapter对象(全局)

PagerAdapter mPagerAdapter=new PagerAdapter() {
    @Override
    public int getCount() {//共有多少页
        return mViews.size();//如果上面创建了int行数组存放资源可以用 .length
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        //return false;//判断是不是一个对象
        return view==object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        View child=mViews.get(position);//找到当前的视图
        container.addView(child);
        return child;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mViews.get(position));//销毁当前视图

    }
};
PagerAdapter

初始化ViewPager

private ViewPager mViewPager;

放入adapter

mViewPager.setAdapter(mPagerAdapter);

若想要使用图片进行轮播的话

首先创建存放轮播视图的集合

private ViewPager mViewPager;
private List<View> mViews= new ArrayList<>();
ViewGroup mDotViewGroup;先new ViewGroup 的对象
List<ImageView> mDotViews=new ArrayList<>(); 并创建集合用于存放轮播图下面的提示小点(其实是图)

然后for循环放入资源

for (int index = 0; index <3 ; index++) {
    ImageView imageView=new ImageView(this);
    imageView.setImageResource(R.mipmap.ic_launcher);
    mViews.add(imageView);//放入轮播图
    ImageView dot=new ImageView(this);
    dot.setImageResource(R.mipmap.ic_launcher);
    dot.setMaxWidth(100);///设置图片的大小
    dot.setMaxHeight(100);///
    LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(80,80);//设置点想要的宽高
    layoutParams.leftMargin=20;
    dot.setLayoutParams(layoutParams);
    dot.setEnabled(false);
    mDotViewGroup.addView(dot);
    mDotViews.add(dot);//放入点资源并设宽高
}

创建PagerAdapter对象

PagerAdapter mPagerAdapter=new PagerAdapter() {
    @Override
    public int getCount() {//共有多少页
        return mViews.size();
    }

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

    @NonNull
    @Override
    public Object    instantiateItem     (@NonNull ViewGroup container, int position) {
        View child=mViews.get(position);//找到当前的视图
        container.addView(child);
        return child;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mViews.get(position));

    }
};
ViewPager mViewPager = findViewById(R.id.view_pager);绑定xml文件中的轮播区域

<androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        />
    <LinearLayout
        android:layout_width="120dp"
        android:layout_height="30dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="30dp"
        android:orientation="horizontal"
        android:id="@+id/dot_layout"
        >

    </LinearLayout>


</RelativeLayout>

//设置adapter
mViewPager.setAdapter(mPagerAdapter);
//mViewPager.setOffscreenPageLimit(4);
ININT_POSITION = 0;//开始设那张图,
mViewPager.setCurrentItem(ININT_POSITION);
setDotViews(1);//解决进入之后不换页点就不变的问题
/*以前是set方法但是已经过期*/
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override//划到某个图就改变对应序号的点
    public void onPageSelected(int position) {
        setDotViews(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

如果是某张图就改变对应得小点的图

private void setDotViews(int position) {
    for (int index = 0; index <mDotViews.size() ; index++) {/*小点会变化*/
        mDotViews.get(index).setImageResource(position ==index?R.drawable.bussy:R.mipmap.ic_launcher);
    }
}

在onCreate()中for循环后写设置已那张图开始,那个点变化来提示

mViewPager.setCurrentItem(0);
setDotViews(0);

Fragment配合ViewPager

首先两个xml文件

一个为viewPager

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="@string/app_name"
        android:textSize="36sp" />

</RelativeLayout>

一个fragment

<?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">
    <androidx.viewpager.widget.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/view_pager">
    </androidx.viewpager.widget.ViewPager>

</LinearLayout>

一个java类继承自Fragment

package com.example.viewpagerpractice;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class TestFragment extends Fragment {

    public static final String POSITION = "position";
    private String mPosition;
//外界调用此方法来传值和获取本类的对象
    public  static TestFragment newInstance(int position){
        TestFragment fragment=new TestFragment();
        Bundle bundle=new Bundle();
        bundle.putInt(POSITION,position);
        fragment.setArguments(bundle);
    return  fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments()!=null){
            mPosition = String.valueOf(getArguments().getInt(POSITION));
            getArguments();

        }

    }

    @Nullable
    @Override//绑定资源
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.fragment_test,null);
        TextView textView=(TextView)view.findViewById(R.id.text_view);
        textView.setText(mPosition);

        return view;
    }
}

viewpager的java代码

package com.example.viewpagerpractice;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;

public class TabViewPager extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tab_viewpager);
        ViewPager viewPager=(ViewPager) findViewById(R.id.view_pager);
        //getSupportFragmentManager多层继承至FragmentActivity获得的
        viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @NonNull
            @Override
            public Fragment getItem(int position) {
                return TestFragment.newInstance(position);
            }

            @Override//返回几个
            public int getCount() {
                return 4;
            }
        });
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值