RecyclerView
是 View 元件,可讓您輕鬆有效地顯示大型資料集。您不必為資料集中的每個項目建立資料檢視,
RecyclerView
可讓您縮減一小部分數量,藉此提升應用程式效能
並回收這些事件
在 Compose 中,您可以使用惰性清單來完成相同的操作。本頁面說明如何將 RecyclerView
實作項目遷移至 Compose 中的 Lazy 清單。
遷移步驟
如要將 RecyclerView
實作項目遷移至 Compose,請按照下列步驟操作:
請在 UI 階層中註解或移除
RecyclerView
,並在階層中尚未出現ComposeView
的情況下,新增ComposeView
來取代RecyclerView
。這個 是您要新增的 Lazy 清單容器:<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- <androidx.recyclerview.widget.RecyclerView--> <!-- android:id="@+id/recycler_view"--> <!-- android:layout_width="match_parent"--> <!-- android:layout_height="match_parent />"--> <androidx.compose.ui.platform.ComposeView android:id="@+id/compose_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
依據下列項目判斷需要哪種 Lazy 清單可組合項類型
RecyclerView
的版面配置管理工具 (請參閱下表)。您選取的可組合函式將會是您在上一個步驟中新增的ComposeView
的頂層可組合函式。LayoutManager
可組合項目
LinearLayoutManager
LazyColumn
或LazyRow
GridLayoutManager
LazyVerticalGrid
或LazyHorizontalGrid
StaggeredGridLayoutManager
LazyVerticalStaggeredGrid
或LazyHorizontalStaggeredGrid
// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
在
RecyclerView.Adapter
實作中為每個檢視畫面類型建立對應的可組合項。每種檢視畫面類型通常會對應至ViewHolder
子類別,但並非一律如此。這些 可組合函式將用來做為不同類型的 UI 表示法 清單中的元素:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
RecyclerView.Adapter
的onCreateViewHolder()
和onBindViewHolder()
方法中的邏輯會由這些可組合項和您提供的狀態取代。在 Compose 中,為項目建立可組合項與將資料繫結至該項之間沒有區隔,這兩個概念已合併。在 Lazy 清單的
content
插槽 (結尾 lambda 參數) 中,使用items()
函式 (或等效的超載) 迴圈列舉清單的資料。在itemContent
lambda 中,針對資料叫用適當的可組合項目:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
常見用途
商品裝飾
RecyclerView
具備 ItemDecoration
的概念,可用來新增
系統特別為清單中的項目繪製出特別的繪圖舉例來說,您可以將
ItemDecoration
可在項目之間加入分隔線:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose 沒有關於項目裝飾的對等概念。您可以直接在組合中新增清單中的任何 UI 裝飾。例如:
如要在清單中新增分隔線,您可以逐一呼叫每個分隔線後面使用 Divider
可組合函式。
項目:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { HorizontalDivider() } } }
項目動畫
您可以在 RecyclerView
上設定 ItemAnimator
,在轉接程式發生變更時,為項目的外觀加上動畫效果。根據預設,RecyclerView
會使用
DefaultItemAnimator
,提供移除、新增和移除基本動畫
移動事件。
延遲清單透過 animateItemPlacement
修飾符提供類似的概念。詳情請參閱「項目動畫」。
其他資源
如要進一步瞭解如何將 RecyclerView
遷移至 Compose,請參閱下列資源:
- 清單和格線:說明如何在 Compose 中實作清單和格線的文件。
- Jetpack Compose 互通性:在 RecyclerView 中使用 Compose:
網誌文章:瞭解如何在
RecyclerView
中有效使用 Compose。
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 清單和格線
- 將
CoordinatorLayout
遷移至 Compose - 其他考量