android------viewpager1和viewpager2的使用(代码片段)

切切歆语 切切歆语     2023-01-16     726

关键词:

Android X的东西都已经使用很久了,都没好好记录一下,

现在记录一下Android X 下 ViewPager1和ViewPager2的使用,几乎是每个项目中都会使用的控件,他们之间还是有点区别的,

案例效果图,ViewPager和ViewPager2

首先ViewPager1和ViewPager2 是在Android X 的appcompat 库中,创建项目就有的

xml

     <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

     <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

首页来看看ViewPager1的Adapter

public class MyFragmentPagerAdapter extends FragmentPagerAdapter 
       
        private List<Fragment> fragmentList;

        public MyFragmentPagerAdapter(FragmentManager fm,List<Fragment> fragmentList) 
            super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
            this.fragmentList = fragmentList;
        

        @NonNull
        @Override
        public Fragment getItem(int position) 
            return fragmentList.get(position);
        

        @Override
        public int getCount() 
            return fragmentList.size();
        
    

ViewPager2的Adapter

public class MyFragmentPagerAdapter extends FragmentStateAdapter 

        private List<Fragment> fragmentList;

        public MyFragmentPagerAdapter(@NonNull @NotNull FragmentActivity fragmentActivity,List<Fragment> fragmentList) 
            super(fragmentActivity);
            this.fragmentList = fragmentList;
        
        @NonNull
        @NotNull
        @Override
        public Fragment createFragment(int i) 
            return fragmentList.get(i);
        

        @Override
        public int getItemCount() 
            return fragmentList.size();
        
    

ViewPager加载Fragment

MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),fragmentList);
        viewpager.setAdapter(pagerAdapter);
        viewpager.setOffscreenPageLimit(fragmentList.size());
        viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() 
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
            

            @Override
            public void onPageSelected(int position) //滑动到第几个
                navigation.getMenu().getItem(position).setChecked(true);
            

            @Override
            public void onPageScrollStateChanged(int state) 
            
        );

ViewPager2加载Fragment

MyFragmentPagerAdapter pagerAdapter = new MyFragmentPagerAdapter(this,fragmentList);
        viewpager2.setAdapter(pagerAdapter);
        viewpager2.setOffscreenPageLimit(fragmentList.size());
        viewpager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() 
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
            

            @Override
            public void onPageSelected(int position) //滑动到第几个
                super.onPageSelected(position);
                navigation.getMenu().getItem(position).setChecked(true);
            

            @Override
            public void onPageScrollStateChanged(int state) 
                super.onPageScrollStateChanged(state);
            
        );

效果图是结合BottomNavigationView+ViewPager一起使用的

上一篇博客讲到了BottomNavigationView,可以去看看他的介绍

BottomNavigationView+ViewPager/ViewPager2的绑定都是一样的

 navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() 
            @Override
            public boolean onNavigationItemSelected(@NonNull @NotNull MenuItem menuItem) 
                if (menuItem.getItemId() == R.id.menu_mail)
                    viewpager.setCurrentItem(0);
                else if (menuItem.getItemId() == R.id.menu_bookshelf)
                    viewpager.setCurrentItem(1);
                else if (menuItem.getItemId() == R.id.menu_my_config)
                    viewpager.setCurrentItem(2);
                
                return false;
            
        );

还有一种方式:

navigation.setOnNavigationItemSelectedListener(item -> 
           Toast.makeText(ApiDemo1Activity2.this,
                   "下标"+item.getOrder(),Toast.LENGTH_LONG).show();
            viewpager.setCurrentItem(item.getOrder());
            return true;
        );

这个下标如何来的呢?

那当然是BottomNavigationView 绑定的按钮中设置的了

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="bottom_navigation_view">

    <item
        android:id="@+id/menu_mail"
        android:icon="@drawable/ic_bottom_mail"
        android:title="@string/book_mail"
        android:orderInCategory="0"
        />

    <item
        android:id="@+id/menu_bookshelf"
        android:icon="@drawable/ic_bottom_books"
        android:orderInCategory="1"
        android:title="@string/book_shelf" />

    <item
        android:id="@+id/menu_my_config"
        android:icon="@drawable/ic_bottom_person"
        android:orderInCategory="2"
        android:title="@string/my" />

</menu>

属性  android:orderInCategory="0"  来设置下标,这样就更方便绑定ViewPager了

总结ViewPager和ViewPager2的区别

  1. ViewPager2API最大的变化是它现在使用RecyclerView。
  2. 使用ViewPager2需要迁移到 AndroidX ,因为android.support库中不支持ViewPager2
  3. FragmentStateAdapter 替换 FragmentStatePagerAdapter
  4. RecyclerView.Adapter 替代 PagerAdapter
  5. registerOnPageChangeCallback替换 addPageChangeListener

官方文档介绍:

ViewPager2  |  Android 开发者  |  Android Developers

android------viewpager1和viewpager2的使用(代码片段)

...久了,都没好好记录一下,现在记录一下AndroidX下ViewPager1和ViewPager2的使用,几乎是每个项目中都会使用的控件,他们之间还是有点区别的,案例效果图,ViewPager和ViewPager2首先ViewPager1和ViewPager2是在AndroidX的... 查看详情

向量 v 的 v[0]、v.begin() 和 v.data() 有啥区别?

】向量v的v[0]、v.begin()和v.data()有啥区别?【英文标题】:Whatisthedifferencebetweenv[0],v.begin()andv.data()ofavectorv?向量v的v[0]、v.begin()和v.data()有什么区别?【发布时间】:2019-10-1914:12:41【问题描述】:我需要显示使用归并排序算法排序... 查看详情

v$session和v$process

V$SESSIONThisviewlistssessioninformationforeachcurrentsession.ColumnDatatypeDescriptionSADDRRAW(4|8)SessionaddressSIDNUMBERSessionidentifierSERIAL#NUMBERSessionserialnumber.Usedtouniquelyidentifyasess 查看详情

在 vue.js(和 webpack)中结合 v-bind 和 v-for 忽略 v-bind

】在vue.js(和webpack)中结合v-bind和v-for忽略v-bind【英文标题】:Combinev-bindandv-forinvue.js(andwebpack)v-bindignored【发布时间】:2018-05-1523:08:03【问题描述】:我想将内联样式绑定到包含v-for的div。但它似乎总是忽略v-bind。这是模板和数... 查看详情

OCaml 和创建列表列表

】OCaml和创建列表列表【英文标题】:OCamlandcreatingalistoflists【发布时间】:2014-03-1120:33:27【问题描述】:我目前正在尝试使用函数来创建:0V12V13V14V210V23V24V31V320V34V41V42V430我发现这样做的一种方法是使用这些方程式:(2*V1-1)*(2*V2-1)... 查看详情

vuemethods和computed,v-show和v-if

方法(method)和计算属性(computed)区别每当触发重新渲染时,调用方法将总会再次执行函数。计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。多次访问计算属性会立即返回之前... 查看详情

v-if和v-show

...-----(显示隐藏)---适用于频繁切换 注释:v-if后还有v-else和v-else-if条件渲染,这里需要注 查看详情

v-if和v-show区别

v-if和v-show区别v-if判断是否要加载,可以减轻服务器压力,按需加载。v-show利用了css的display,可以提高客户端的流畅度。看需求使用那个,如果页面上会经常用到,用v-show,例如tab栏等。根据用户的需求加载的用v-if,选择性的向... 查看详情

vue基础之v-if和v-show的使用和特点(代码片段)

...删除或创建元素v-show的特点:每次不会重新进行DOM的删除和创建操作,只是切换了元素的display:none样式一般来说,v-if有更高的切换消耗而v-show有更高的初始渲染消耗。因此,如果需要频繁切换v-show较好,如果在运行时条件不大... 查看详情

Mongoose 错误:无法同时更新 __v 和 __v

】Mongoose错误:无法同时更新__v和__v【英文标题】:Mongooseerror:Cannotupdate__vand__vatthesametime【发布时间】:2014-09-1218:51:14【问题描述】:我需要这方面的帮助。我有这个从一开始就一直在工作的节点项目。最近我开始收到关于mongoos... 查看详情

Mongoose 错误:无法同时更新 __v 和 __v

】Mongoose错误:无法同时更新__v和__v【英文标题】:Mongooseerror:Cannotupdate__vand__vatthesametime【发布时间】:2014-09-1218:51:14【问题描述】:我需要这方面的帮助。我有这个从一开始就一直在工作的节点项目。最近我开始收到关于mongoos... 查看详情

v-text和v-html绑定数据显示

1.v-text:相当有js的$("#root").text();2.v-html相当于js的$("#root").html();3.插值赋值的数据会被v-text,或者v-html覆盖。并且数据会从左到右覆盖。本例中v-text会被v-html覆盖<!DOCTYPEhtml><html><head><metaname="viewport"content= 查看详情

vue中v-if和v-show的使用场景

...文档https://cn.vuejs.org/v2/guide/conditional.html#v-if-vs-v-show2.v-if和v-show的区别2.1官方解释v-if是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if也是惰性的:如果在初始渲... 查看详情

vue中v-if和v-show的使用场景

...文档https://cn.vuejs.org/v2/guide/conditional.html#v-if-vs-v-show2.v-if和v-show的区别2.1官方解释v-if是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if也是惰性的:如果在初始渲... 查看详情

v-show和v-if的区别

...换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组 查看详情

v-if和v-show的区别(代码片段)

要想了解v-if和v-show的区别,我们还是需要了解一下这两者是什么。v-if和v-show就是用来判断视图层从而展示效果的。v-if是通过创建或者删除DOM节点来实现元素的显示以及隐藏的v-show是通过CSS中的display属性来控制元素的显示以... 查看详情

挑战程序设计竞赛(算法和数据结构)——12.1图的基本概念

图的表述和术语顶点集合位V,边集合为E的图记作G=(V,E)G=(V,E)G=(V,E)。另外,G=(V,E)G=(V,E)G=(V,E)的顶点和-边数分别为∣V∣\\midV\\mid∣V∣和∣E∣\\midE\\mid∣E∣。链接两个顶点uuu,vvv的边记作e=(u,v)e=(u,v)e... 查看详情

比较v-bind和v-model

简单来说,区别如下:1.v-bind用来绑定数据和属性以及表达式,缩写为‘:‘2.v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用一、v-modelv-model多在表单中使用,在表单元素上创建双向绑定,根据控件类型... 查看详情