可垂直滑动的ViewPager2

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);
        }
    }


}

效果
在这里插入图片描述

扫描二维码关注公众号,回复: 9599924 查看本文章
发布了42 篇原创文章 · 获赞 7 · 访问量 7722

猜你喜欢

转载自blog.csdn.net/HouXinLin_CSDN/article/details/104440001
今日推荐