本篇内容介绍了“Android如何实现自动变换大小的组件ViewPager2”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
ViewPager2的概念
ViewPager2是一个翻页视图组件
ViewPager2能做什么
支持垂直方向的滑动且实现极其简单。
完全支持RecyclerView的相关配置功能。
支持多个PageTransformer。
支持DiffUtil,局部数据刷新和Item动画。
支持模拟用户滑动与禁止用户操作。
ViewPager2的用法
因为ViewPager2是基于RecyclerView的,所以在使用上与RecyclerView的使用基本一致
ViewPager2常用的API
 1. setAdapter()   为viewpager2设置是配置
 2. setOrientation()  设置视图翻页的方向,可以设置垂直方向,也可以设置水平方向。
 3. setPageTransformer() 设置翻页的动画
举个简单的例子,adapter部分的代码省略了
第一步: activity_main.xml
// 第一步: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <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" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.viewpager2.widget.ViewPager2 android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/view_pager"/> </LinearLayout>
第二步:创建适配器的视图
// 第二步:创建适配器的视图 <!-- ViewPager2要求每页的宽高都必须是match_parent --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/iv_pic" android:layout_width="match_parent" android:layout_height="360dp" android:scaleType="fitCenter" /> <TextView android:id="@+id/tv_desc" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
第三步: 创建适配器adapter
// 第三步:创建适配器adapter
public class viewpagerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    // 声明一个上下文对象
    private Context mContext; 
    // 声明一个商品列表,用于渲染adapter
    private List<GoodsInfo> mGoodsList = new ArrayList<GoodsInfo>(); 
    // 函数构造
    public viewpagerAdapter(Context context, List<GoodsInfo> goodsList) {
        mContext = context;
        mGoodsList = goodsList;
    }
    // 创建列表项的视图持有者
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup vg, int viewType) {
        // 根据布局文件item_mobile.xml生成视图对象
        View v = LayoutInflater.from(mContext).inflate(R.layout.item_mobile, vg, false);
        return new ItemHolder(v);
    }
    // 绑定列表项的视图持有者
    public void onBindViewHolder(RecyclerView.ViewHolder vh, final int position) {
        ItemHolder holder = (ItemHolder) vh;
        holder.iv_pic.setImageResource(mGoodsList.get(position).pic);
        holder.tv_desc.setText(mGoodsList.get(position).desc);
    }
    // 定义列表项的视图持有者
    public class ItemHolder extends RecyclerView.ViewHolder {
        public ImageView iv_pic; // 声明列表项图标的图像视图
        public TextView tv_desc; // 声明列表项描述的文本视图
        public ItemHolder(View v) {
            super(v);
            iv_pic = v.findViewById(R.id.iv_pic);
            tv_desc = v.findViewById(R.id.tv_desc);
        }
    }
}第四步:书写MainAcvitivity.java,调用ViewPager的API
//第四步:书写MainAcvitivity.java,调用ViewPager的API
public class MainActivity extends AppCompatActivity {
    private List<GoodsInfo> viewPagerList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        // 从布局文件中获取翻页视图
        ViewPager2 viewPager2 = findViewById(R.id.view_pager);
        // 构建适配器
        viewpagerAdapter vpa = new viewpagerAdapter(viewPagerList);
        // 设置翻页视图的排列方向为水平方向
        viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
        // 为翻页视图添加适配器
        viewPager2.setAdapter(vpa);
    }
    private void initData(){
            GoodsInfo g1 = new GoodsInfo("123", R.drawable.cloudy);
            viewPagerList.add(g1);
            GoodsInfo g2 = new GoodsInfo("456", R.drawable.moon);
            viewPagerList.add(g2);
            GoodsInfo g3 = new GoodsInfo("789", R.drawable.sunny);
            viewPagerList.add(g3);
    }
}有没有发现,这个和recycleView的写法一摸一样。
ViewPager2与fragment结合使用
第一步:activity_main.xml视图
// 第一步:activity_main.xml视图 <?xml version="1.0" encoding="utf-8"?> <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" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.viewpager2.widget.ViewPager2 android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/view_pager"/> </LinearLayout>
第二步:创建fragment所需要的视图fragment_blank.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" tools:context=".BlankFragment"> <!-- TODO: Update blank fragment layout --> <TextView android:id="@+id/mTextView" android:layout_width="match_parent" android:layout_height="match_parent" android:text="@string/hello_blank_fragment" android:textSize="36sp" android:gravity="center"/> </FrameLayout>
第三步:fragment所需的代码
public class BlankFragment extends Fragment {
    private static final String ARG_PARAM1 = "param1";
    String mTextString = "xxx";
    View rootView;
    public static BlankFragment newInstance(String param1) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        fragment.setArguments(args);
        return fragment;
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mTextString = getArguments().getString(ARG_PARAM1);
        }
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if(rootView == null) {
            rootView = inflater.inflate(R.layout.fragment_blank, container, false);
        }
        initView();
        return rootView;
    }
    private void initView() {
        TextView textView = rootView.findViewById(R.id.mTextView);
        textView.setText(mTextString);
    }
}第四步:创建承载fragment所需要的适配器
public class MyFragmentAdapter extends FragmentStateAdapter {
    List<Fragment> fragments = new ArrayList<>();
    public MyFragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragments) {
        super(fragmentManager, lifecycle);
        this.fragments = fragments;
    }
    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragments.get(position);
    }
    @Override
    public int getItemCount() {
        return fragments.size();
    }
}第五步:书写MainAcvitivity.java,调用ViewPager的API
public class MainActivity extends AppCompatActivity {
    ViewPager2 viewPager2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initPage();
    }
    private void initPage() {
        List<Fragment> fragments = new ArrayList<>();
        fragments.add(BlankFragment.newInstance("fragment1"));
        fragments.add(BlankFragment.newInstance("fragment2"));
        fragments.add(BlankFragment.newInstance("fragment3"));
        fragments.add(BlankFragment.newInstance("fragment4"));
        viewPager2 = findViewById(R.id.myViewPager);
        viewPager2.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(),
                getLifecycle(),fragments));
    }
}ViewPager2与导航栏配合使用
代码简写,只写相关的部分
// activity_main.xml 写上用到的两个组件TabLayout与ViewPager2 <?xml version="1.0" encoding="utf-8"?> <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" android:orientation="vertical" tools:context=".MainActivity"> <com.google.android.material.tabs.TabLayout android:id="@+id/mTabLayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="0.1"> <com.google.android.material.tabs.TabItem android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Monday" /> <com.google.android.material.tabs.TabItem android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tuesday" /> <com.google.android.material.tabs.TabItem android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Wednesday" /> </com.google.android.material.tabs.TabLayout> <androidx.viewpager2.widget.ViewPager2 android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/myViewPager" android:background="@color/purple_500" > </androidx.viewpager2.widget.ViewPager2> </LinearLayout>
public class MainActivity extends AppCompatActivity {
    ViewPager2 viewPager2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initPage();
    }
    private void initPage() {
        List<Fragment> fragments = new ArrayList<>();
        fragments.add(BlankFragment.newInstance("fragment1"));
        fragments.add(BlankFragment.newInstance("fragment2"));
        fragments.add(BlankFragment.newInstance("fragment3"));
        fragments.add(BlankFragment.newInstance("fragment4"));
        viewPager2 = findViewById(R.id.myViewPager);
        viewPager2.setAdapter(new MyFragmentAdapter(getSupportFragmentManager(),
                getLifecycle(),fragments));
        //绑定使用
        new TabLayoutMediator(findViewById(R.id.mTabLayout),viewPager2,new TabLayoutMediator.TabConfigurationStrategy(){
            @Override
            public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                switch (position){
                    case 0:
                        tab.setText("1");
                        break;
                    case 1:
                        tab.setText("2");
                        break;
                    case 2:
                        tab.setText("3");
                        break;
                }
            }
        }).attach();
    }
}