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>
根據
RecyclerView
的版面配置管理工具,判斷您需要哪種類型的 Lazy list 可組合項 (請參閱下表)。您選取的可組合函式將會是您在上一個步驟中新增的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 - 其他考量