iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0

嗨大家今天過得好嗎?昨天了解了 ViewPager 的基本功能、滑動動畫還有無限自動輪播,今天想來聊聊 Google 在 2019 年再推出升級版的 ViewPager2 有哪些改變還有如何升級?

要升級 ViewPager2 嗎?

在 ViewPager2 的世界裡滑動的動畫一樣是透過 PageTransformer 實現,提供 View 和 position 的參數可以設定動畫,但不同的是原先的 PagerAdapter 換成大家更熟悉的 RecyclerView.Adapter;如果分頁是一個一個的 Fragment 原來的 Adapter 也從 FragmentStatePagerAdapter 換成 FragmentStateAdapter;最後是監聽 ViewPager 滑動事件 registerOnPageChangeCallback 取代了 addPageChangeListener,官方列出 ViewPager2 主要新增了下列幾項功能:

  • 支援右到左 ( RTL )的 layout 顯示 ( 第一頁從畫面的最右邊開始 )
  • 支援垂直方向滑動
  • 支援 notifyDataSetChanged()

看到第一點的新功能原先有點疑惑,疑惑的點是 ViewPager 原來就可以向左向右滑,那 ViewPager2 新增支援的 RTL 是什麼意思?後來才發現這是我 LTR ( Left To Right ) 本位主義的想法,有些語言就是由右至左的方式書寫的,因此第一頁也會從最右邊起算,但原來的 ViewPager 並沒有支援。在 ViewPager2 新增 android:layoutDirection 的屬性,只要設為 rtl 就可以實現右至左排列的功能。垂直滑動在 ViewPager2 也可以輕易實現,只要新增 android:orientation 的屬性設定為 vertical 就完成。

還記得原來 ViewPager 的機制是在 instantiateItem 的 method 中畫出 View 和綁定位置的嗎?因為 PagerAdapter 並不清楚綁定的 View 是誰?安好嗎?幾歲?住哪?要改變已經創建好的 View 就要全部砍掉重練,先全部移除後再重建一次,這樣搞誰受得了?因此後來推出的 ViewPager 才有支援比較完整的 notifiDataSetChanged() 機制,這點應該不算新功能比較像 bug fix 吧?因為 Adapter 已經換成 RecyclerView.Adapter,Adapter 對 ViewHolder 的掌握度就比原先 PagerAdapter 來得高,使用 notifyDataSetChanged() 才有效果。

如何升級 ViewPager2?

主要修改專案中使用到 ViewPager 的幾個地方:

  • import path 改成 "androidx.viewpager2:viewpager2:1.0.0"
  • 在 XML 把 ViewPager 改成 androidx.viewpager2.widget.ViewPager2
  • Adapter 繼承自 RecyclerView.Adapter
  • TabLayout 在 ViewPager2 已經移至 Material component 的 package

看到官方有繼續推出新版本、升級 ViewPager 還是挺好的,如果專案有用到 ViewPager 的話也要找機會更新到最新的 ViewPager2,才能讓 ViewPager 的功能持續升級越來越好用。喜歡今天分享內容的邦友請繼續關注「打造一個厲害的普通 Android App - 使用者體驗優化」的主題,我們明天見。


上一篇
ViewPager (1):帶動畫的換頁
下一篇
使用 res 的正確姿勢 (1):簡介
系列文
打造一個厲害的普通 Android App - 使用者體驗優化16
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言