優雅地使用Android ViewPager2

2021-10-24 14:13:35 字數 3660 閱讀 5794

viewpager2 是 viewpager 庫的改進版本,可提供增強型功能並解決viewpager的一些問題

viewpager有兩個弊端:(1)不能關閉預載入,(2)更新adapter不生效。

我們在載入資料的時候,viewpager缺省會幫我們預載入前後兩個頁面的資料,但是這兩個view是不可見的,目前viewpager2對fragment支援只能fragmentstateadapter,fragmentstateadapter在遇到預載入時,只會建立fragment物件,不會把fragment真正的加入到布局中,所以自帶懶載入效果。

(1)垂直方向支援,可以通過設定 viewpager2 元素的 android:orientation 屬性為其啟用垂直分頁。

(2)更高效的notifydatasetchanged,在執行時動態修改 fragment 集合,而 viewpager2 會正確顯示修改後的集合。

匯入依賴:

implementation "com.google.android.material:material:1.2.1"
activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

xmlns:android

=""=""

xmlns:tools

=""android:layout_width

="match_parent"

android:layout_height

="match_parent"

android:orientation

="vertical"

tools:context

=".mainactivity"

>

android:id

="@+id/tablayout"

android:layout_width

="match_parent"

android:layout_height

="wrap_content"

="fill"

="@android:color/holo_blue_light"

="2dp"

="fixed"

="@android:color/holo_blue_light"

="@android:color/black"

/>

android:id

="@+id/viewpager"

android:layout_width

="match_parent"

android:layout_height

="match_parent"

/>

linearlayout

>

mainactivity

class mainactivity :()

private

funinit()

.attach()

}}

myfragmentstateadapter

class

myfragmentstateadapter

(fragmentactivity: fragmentactivity,

private

val list: list):

fragmentstateadapter

(fragmentactivity)

override

fungetitemcount()

: int

}

fragment切換的動畫

private

const

val min_scale =

0.85f

private

const

val min_alpha =

0.5f

class zoomoutpagetransformer : viewpager2.

pagetransformer

position <=

1->

else

scalex = scalefactor

scaley = scalefactor

alpha =

(min_alpha +((

(scalefactor - min_scale)/(

1- min_scale))*

(1- min_alpha)))

}else

->}}

}}

如果你想實現底部導航欄,用法也差不多

修改xml布局檔案

<?xml version="1.0" encoding="utf-8"?>

xmlns:android

=""=""

xmlns:tools

=""android:layout_width

="match_parent"

android:layout_height

="match_parent"

android:orientation

="vertical"

tools:context

=".mainactivity"

>

android:id

="@+id/view_pager"

android:layout_width

="match_parent"

android:layout_height

="0dp"

android:layout_weight

="1"

/>

android:id

="@+id/tab_layout"

android:layout_width

="match_parent"

android:layout_height

="wrap_content"

="fill"

="@android:color/holo_blue_light"

="2dp"

="fixed"

="@android:color/holo_blue_light"

="@android:color/black"

/>

linearlayout

>

修改activity的**

class bottomactivity :()

private

funinit()

override

funontabunselected

(tab: tablayout.tab?

)override

funontabreselected

(tab: tablayout.tab?)}

) view_pager.isuserinputenabled =

false

//禁用頁面滑動

//tablayout與viewpager2聯動

tablayoutmediator

(tab_layout, view_pager)

.attach()

}}

優雅地使用列舉enum

在開發中,我們可能會遇到這樣的問題 某乙個物件的某些字段比如常見的 的狀態,欄位名字叫 status,在資料庫中儲存的時候存的值一般是數字,比如 0 未處理 1 已處理 2 已取消 在介面展示的時候,我們不可能直接將數字展示,需要將它的實際含義進行對應展示,以前的自己 可能會這樣寫 未處理 已處理已...

SpringBoot如何優雅地使用Swagger2

spring boot 框架是目前非常流行的微服務框架,我們很多情況下使用它來提供 rest api。而對於 rest api 來說很重要的一部分內容就是文件,swagger 為我們提供了一套通過 和註解自動生成文件的方法,這一點對於保證 api 文件的及時性將有很大的幫助。本文將使用 swagge...

前端如何優雅地使用列舉

在前端開發中我們經常遇到這樣一種情況 假設我們要渲染乙個訂單列表,後端返回的資料中包含這樣乙個字段 訂單狀態 orderstatus 0後端可能會告訴我們,它對應後端的這樣一組值 那麼我們在前端如何優雅地把後端所返回的值0轉換成字串已完成呢?這就是本文要討論的問題。為了引出我們的方案,我們先來看乙個...