应用场景
引导界面,相册多图片预览
多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;
}
});
}
}