Viewpager的使用)
- View的介绍
- ViewPager与Fragment结合使用 ( 重 点 )
- Fragment 和Viewpager的区别
View的介绍
使用效果图
View的介绍
Viewpager,视图翻页工具,提供了多页面切换的效果。Android3.0后引入的一个UI空间,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的App一般不在兼容3.0及以下的系统版本,另外现在大多数使用Androidstudio进行开发,默认导入v7包,v7包含了v4包。
Viewpager使用起来就是我们通过创建adpter给他填充多个view,左右滑动时,切换不同的view。Google官方是建议我们使用Fragment来填充Viewpager的,这样可以更加方便的生成每个page,以及管理每个page的声明周期
Viewpager 直接继承了ViewGroup,所以它是一个容器类,可以在其中添加其他的view类。
ViewPager需要一个pager Adpter适配器类给他提供数据
ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPaterAdpter和FragmentStatepagerAdpter类供Fragment中的Viewpager 使用
viewpager的用法和ListView类似
1.在activity.xml中引入控件
<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">
<androidx.viewpager.widget.ViewPager
android:layout_width="wrap_content"
android:id="@+id/vp"
android:layout_height="wrap_content"></androidx.viewpager.widget.ViewPager>
</LinearLayout>
2.然后在layout文件中,创建一个viewpager的布局文件
<LinearLayout 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/vptext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></TextView>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></ImageView>
</LinearLayout>
3.类似于listView一样,创建适配器,要继承PagerAdpter,父类的方法要重写
import android.content.Context;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
public class Myadpter extends PagerAdapter {
private Context context;
private List<String> list;
private List<Integer>list2;
public Myadpter(Context context, List<String> list, List<Integer> list2) {
this.context = context;
this.list = list;
this.list2 = list2;
}
//总共有几个页面
@Override
public int getCount() {
return list.size();
}
//判断一个页面是否与instantiateItem方法返回的Object一致
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view==object;
}
//销毁一个页面 移除一个给定位置的页面,适配器有责任从容器中删除这个视图,这个是为了确保在finishUpdate(viewGroup)返回时视图能够被移除。
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
//super.destroyItem(container, position, object);
container.removeView((View) object);
}
//创建一个页面 判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图,通常
//我们直接写return view == object;就可以了
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View inflate = LayoutInflater.from(context).inflate(R.layout.vp_layout, null);
TextView textView = inflate.findViewById(R.id.vptext);
textView.setText(list.get(position));
ImageView imageView = inflate.findViewById(R.id.image);
imageView.setImageResource(list2.get(position));
container.addView(inflate);
return inflate;
}
}
4.在Activity中初始化viewPager和adpter
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager vp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vp=findViewById(R.id.vp);
//1.数据源
List<Integer> list2 = new ArrayList<>();
list2.add(R.mipmap.ic_launcher);
list2.add(R.mipmap.ic_launcher_round);
list2.add(R.mipmap.bing);
List<String> list = new ArrayList<>();
list.add("第一页");
list.add("第二页");
list.add("第三页");
//2.适配器
Myadpter vpAdpter = new Myadpter(this,list,list2);
//3.设置适配器
vp.setAdapter(vpAdpter);
}
}
运行效果
这里没有视频演示,滑动可以看到我们的效果
ViewPager与Fragment结合使用 ( 重 点 )
与Fragment结合使用其实也一样,只是用Fragment代替原先的View,填充ViewPager;然后就是Adapter不一样,配合Fragment使用的有两个Adapter:FragmentPagerAdapter和FragmentStatePagerAdapter。
activity布局
<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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".Main2Activity">
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></androidx.viewpager.widget.ViewPager>
</LinearLayout>
先创建Fragment
创建适配器
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
public class FragmentAdpter extends FragmentPagerAdapter {
private List<Fragment> list;
public FragmentAdpter(@NonNull FragmentManager fm,List<Fragment> list) {
super(fm);
this.list=list;
}
@NonNull
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
}
activity代码
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import java.util.ArrayList;
import java.util.List;
public class Main2Activity extends AppCompatActivity {
private ViewPager vp2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
vp2 = (ViewPager) findViewById(R.id.vp2);
//1.数据源
List<Fragment> list = new ArrayList<>();
list.add(new BlankFragment());
list.add(new BlankFragment2());
list.add(new BlankFragment3());
//2.适配器
FragmentAdpter fragmentAdpter = new FragmentAdpter(getSupportFragmentManager(), list);
//3.设置适配器
vp2.setAdapter(fragmentAdpter);
}
}
上面说到的两个Adapter:FragmentPagerAdapter和FragmentStatePagerAdapter。的区别:
FragmentStatePagerAdapter
fragment的生命周期会执行
onDestoryView
onDestory
onCreate
onCreateView
fragment会被销毁
适用用 图片预览等多个fragment的情况
FragmentPagerAdapter
onDestoryView
onCreateView
fragment不会被销毁
适用于引导页等少个fragment的情况
Fragment 和Viewpager的区别
viewpager是一个滑动bai切换的du视图或者zhi说控件。
fragment是一个dao轻量级的Activity。