ViewPager2可以用来代替ViewPager,是ViewPager的改进版本,提供并解决了ViewPager常见的问题。最显著的一个特点是支持垂直滑动,要想使用ViewPager2,先要将项目迁移到androidx,因为ViewPager2只有在androidx下才有。
然后添加依赖。
implementation "androidx.viewpager2:viewpager2:1.0.0"
viewpager2使用非常简单,如果你使用过RecyclerView那就更简单了,
首先编写布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/shadow_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager2"
android:layout_width="match_parent"
android:layout_height="match_parent"></androidx.viewpager2.widget.ViewPager2>
</LinearLayout>
单个视图item
<?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">
<ImageView
android:scaleType="centerCrop"
android:id="@+id/imageview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ImageView>
</LinearLayout>
MainActivity
package com.hxl.gongzhonghaodemo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
String[] url ={
"https://pic1.zhimg.com/80/v2-d90f73dc5a5cd06756ea820b1380aabd_hd.jpg",
"https://c-ssl.duitang.com/uploads/item/201505/09/20150509171654_dGsCB.jpeg",
"https://c-ssl.duitang.com/uploads/item/201509/17/20150917153109_svQch.jpeg"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager2 viewPager2 = (ViewPager2) findViewById(R.id.viewpager2);
viewPager2.setAdapter(new RecyclerView.Adapter<ViewPagerViewHolder>() {
@NonNull
@Override
public ViewPagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_viewapger, parent,false);
return new ViewPagerViewHolder(inflate);
}
@Override
public void onBindViewHolder(@NonNull ViewPagerViewHolder holder, int position) {
getBitmapFromUrl(holder.mImageView,url[position]);
}
@Override
public int getItemCount() {
return url.length;
}
});
}
//加载图片
private void getBitmapFromUrl(ImageView imageView,String str){
new Thread(() -> {
try {
URL url =new URL(str);
Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
imageView.post(() -> imageView.setImageBitmap(bitmap));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
class ViewPagerViewHolder extends RecyclerView.ViewHolder{
public ImageView mImageView;
public ViewPagerViewHolder(@NonNull View itemView) {
super(itemView);
mImageView=itemView.findViewById(R.id.imageview);
}
}
}
效果
此时,如果想垂直滑动的话,可以在xml中对ViewPager2设置android:orientation="vertical"属性,也可以在代码中设置。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/shadow_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.viewpager2.widget.ViewPager2
android:orientation="vertical"
android:id="@+id/viewpager2"
android:layout_width="match_parent"
android:layout_height="match_parent"></androidx.viewpager2.widget.ViewPager2>
</LinearLayout>
viewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
效果
RecyclerView.Adapter
我们在学BaseAdapter时候,getView有三种形式,逗比、普通、文艺
逗比:每次系统getView时候都去加载xml。
普通:复用参数convertView。
文艺:编写ViewHolder重用组件。
而最初的RecyclerView.Adapter设计思想就是文艺式,使用时,要编写一个自己的ViewHolder类继承RecyclerView.ViewHolder,然后在Adapter< VH >指明。内部的onCreateViewHolder则是用来创建ViewHolder。如果item是多布局形式,就需要返回不同的ViewHolder,更具参数viewType可以判断,但是要重写getItemViewType。onBindViewHolder则在绑定数据时候被调用。
而ViewPager2则也复用了RecyclerView.Adapter来完成工作。
notifyDataSetChanged
当数据发生变化时,可以通过RecyclerView.Adapter的notifyDataSetChanged来刷新。
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
ViewPager2 viewPager2;
private RecyclerView.Adapter mAdapter;
String[] url ={
"https://pic1.zhimg.com/80/v2-d90f73dc5a5cd06756ea820b1380aabd_hd.jpg",
"https://c-ssl.duitang.com/uploads/item/201505/09/20150509171654_dGsCB.jpeg",
"https://c-ssl.duitang.com/uploads/item/201509/17/20150917153109_svQch.jpeg"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager2 = (ViewPager2) findViewById(R.id.viewpager2);
viewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
mAdapter=new RecyclerView.Adapter<ViewPagerViewHolder>() {
@NonNull
@Override
public ViewPagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View inflate = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item_viewapger, parent,false);
return new ViewPagerViewHolder(inflate);
}
@Override
public void onBindViewHolder(@NonNull ViewPagerViewHolder holder, int position) {
getBitmapFromUrl(holder.mImageView,url[position]);
}
@Override
public int getItemCount() {
return url.length;
}
};
viewPager2.setAdapter(mAdapter);
}
private void getBitmapFromUrl(ImageView imageView,String str){
new Thread(() -> {
try {
URL url =new URL(str);
Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
imageView.post(() -> imageView.setImageBitmap(bitmap));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
public void onBtnClick(View view) {
url[0]="https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1561029846,2504603863&fm=26&gp=0.jpg";
mAdapter.notifyDataSetChanged();
}
class ViewPagerViewHolder extends RecyclerView.ViewHolder{
public ImageView mImageView;
public ViewPagerViewHolder(@NonNull View itemView) {
super(itemView);
mImageView=itemView.findViewById(R.id.imageview);
}
}
}
效果