Android中ViewPager1和ViewPager2的使用教程
Android X的東西都已經(jīng)使用很久了,都沒(méi)好好記錄一下,
現(xiàn)在記錄一下Android X 下 ViewPager1和ViewPager2的使用,幾乎是每個(gè)項(xiàng)目中都會(huì)使用的控件,他們之間還是有點(diǎn)區(qū)別的,
案例效果圖,ViewPager和ViewPager2
首先ViewPager1和ViewPager2 是在Android X 的appcompat 庫(kù)中,創(chuàng)建項(xiàng)目就有的
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"/>
首頁(yè)來(lái)看看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) {//滑動(dòng)到第幾個(gè) 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) {//滑動(dòng)到第幾個(gè) super.onPageSelected(position); navigation.getMenu().getItem(position).setChecked(true); } @Override public void onPageScrollStateChanged(int state) { super.onPageScrollStateChanged(state); } });
效果圖是結(jié)合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, "下標(biāo)"+item.getOrder(),Toast.LENGTH_LONG).show(); viewpager.setCurrentItem(item.getOrder()); return true; });
這個(gè)下標(biāo)如何來(lái)的呢?
那當(dāng)然是BottomNavigationView 綁定的按鈕中設(shè)置的了
<?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" 來(lái)設(shè)置下標(biāo),這樣就更方便綁定ViewPager了
總結(jié)ViewPager和ViewPager2的區(qū)別
- ViewPager2API最大的變化是它現(xiàn)在使用RecyclerView。
- 使用ViewPager2需要遷移到 AndroidX ,因?yàn)閍ndroid.support庫(kù)中不支持ViewPager2
- FragmentStateAdapter 替換 FragmentStatePagerAdapter
- RecyclerView.Adapter 替代 PagerAdapter
- registerOnPageChangeCallback替換 addPageChangeListener
官方文檔介紹:
ViewPager2 | Android 開發(fā)者 | Android Developers
到此這篇關(guān)于Android中ViewPager1和ViewPager2的使用的文章就介紹到這了,更多相關(guān)Android ViewPager1和ViewPager2使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin ViewModelProvider.Factory的使用實(shí)例詳解
這篇文章主要介紹了Kotlin ViewModelProvider.Factory的使用,在我們使用 ViewModel 的時(shí)候,我們會(huì)發(fā)現(xiàn),有的時(shí)候我們需要用到 ViewModelFactory,有的時(shí)候不需要2023-02-02Android Studio下無(wú)線調(diào)試的方法
這篇文章主要為大家詳細(xì)介紹了Android Studio平臺(tái)下無(wú)線調(diào)試的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android中使用DialogFragment編寫對(duì)話框的實(shí)例教程
這篇文章主要介紹了Android中使用DialogFragment編寫對(duì)話框的實(shí)例教程,DialogFragment也是一種Fragment,因而管理生命周期時(shí)比較給力,需要的朋友可以參考下2016-04-04詳解Android WebView的input上傳照片的兼容問(wèn)題
本篇文章主要介紹了詳解Android WebView的input上傳照片的兼容問(wèn)題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08Android中GIF動(dòng)圖的播放控制和監(jiān)聽詳解
android下播放gif圖片功能似乎并不常用,很多時(shí)候還是以展示靜態(tài)圖片為主,可能是由于gif圖體積比較大吧。不過(guò)像表情動(dòng)畫什么的,可能還是需要gif圖的。本文主要給大家介紹了關(guān)于Android中GIF動(dòng)圖的播放控制和監(jiān)聽的相關(guān)資料,需要的朋友可以參考下。2017-05-05Android 手機(jī)衛(wèi)士實(shí)現(xiàn)平移動(dòng)畫示例
這篇文章主要介紹了Android 手機(jī)衛(wèi)士實(shí)現(xiàn)平移動(dòng)畫的實(shí)例代碼,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10Android依據(jù)名字通過(guò)反射獲取在drawable中的圖片
依據(jù)圖片的名字,通過(guò)反射獲取其在drawable中的ID,在根據(jù)此ID顯示圖片,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-06-06