RecyclerView
là một thành phần Khung hiển thị giúp bạn dễ dàng hiển thị một cách hiệu quả
những tập dữ liệu lớn. Thay vì tạo chế độ xem cho từng mục trong tập dữ liệu,
RecyclerView
cải thiện hiệu suất của ứng dụng bằng cách duy trì một nhóm nhỏ
lượt xem và tái chế thông qua các mục đó khi bạn cuộn qua các mục đó.
Trong Compose, bạn có thể sử dụng Danh sách lazy để thực hiện cùng việc. Trang này
mô tả cách bạn có thể di chuyển phương thức triển khai RecyclerView
để sử dụng danh sách Lazy
trong Compose.
Các bước di chuyển
Để di chuyển phương thức triển khai RecyclerView
sang Compose, hãy làm theo các bước sau:
Đánh dấu hoặc xoá
RecyclerView
khỏi hệ phân cấp giao diện người dùng rồi thêm mộtComposeView
để thay thế nếu chưa có thuộc tính này trong hệ phân cấp. Chiến dịch này là vùng chứa cho danh sách Lazy mà bạn sẽ thêm vào:<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>
Xác định loại thành phần kết hợp danh sách Lazy mà bạn cần dựa trên Trình quản lý bố cục của
RecyclerView
(xem bảng bên dưới). Thành phần kết hợp mà bạn chọn sẽ là thành phần kết hợp cấp cao nhất củaComposeView
mà bạn đã thêm vào bước trước đó.LayoutManager
Thành phần kết hợp
LinearLayoutManager
LazyColumn
hoặcLazyRow
GridLayoutManager
LazyVerticalGrid
hoặcLazyHorizontalGrid
StaggeredGridLayoutManager
LazyVerticalStaggeredGrid
hoặcLazyHorizontalStaggeredGrid
// recyclerView.layoutManager = LinearLayoutManager(context) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { // We use a LazyColumn since the layout manager of the RecyclerView is a vertical LinearLayoutManager } }
Tạo một thành phần kết hợp tương ứng cho từng loại khung hiển thị trong Triển khai
RecyclerView.Adapter
. Mỗi loại chế độ xem thường liên kết với mộtViewHolder
, mặc dù điều này không phải lúc nào cũng đúng. Các thành phần kết hợp sẽ được dùng làm đại diện cho giao diện người dùng cho các loại trong danh sách của bạn:@Composable fun ListItem(data: MyData, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth()) { Text(text = data.name) // … other composables required for displaying `data` } }
Logic trong
onCreateViewHolder()
củaRecyclerView.Adapter
và Các phương thứconBindViewHolder()
sẽ được thay thế bằng các thành phần kết hợp này và mà bạn cung cấp cho họ. Trong Compose, không có sự phân tách giữa tạo một thành phần kết hợp cho một mục và liên kết dữ liệu vào đó – những khái niệm này đã liên kết.Trong khe
content
của danh sách Lazy (tham số lambda theo sau), sử dụng hàmitems()
(hoặc phương thức nạp chồng tương đương) để lặp lại theo phương thức cho danh sách của bạn. Trong hàm lambdaitemContent
, hãy gọi phương thức phù hợp mục có thể kết hợp cho dữ liệu của bạn:val data = listOf<MyData>(/* ... */) composeView.setContent { LazyColumn(Modifier.fillMaxSize()) { items(data) { ListItem(it) } } }
Các trường hợp sử dụng phổ biến
Đồ trang trí vật phẩm
RecyclerView
có khái niệm về ItemDecoration
mà bạn có thể sử dụng để thêm
bản vẽ đặc biệt cho các mục trong danh sách. Ví dụ: bạn có thể thêm
ItemDecoration
để thêm đường phân chia giữa các mục:
val itemDecoration = DividerItemDecoration(recyclerView.context, LinearLayoutManager.VERTICAL) recyclerView.addItemDecoration(itemDecoration)
Compose không có khái niệm tương đương về trang trí mục. Thay vào đó, bạn
có thể thêm trực tiếp bất kỳ thành phần trang trí giao diện người dùng nào vào danh sách trong cấu trúc. Ví dụ:
để thêm bộ chia vào danh sách, bạn có thể sử dụng thành phần kết hợp Divider
sau mỗi lần
mục:
LazyColumn(Modifier.fillMaxSize()) { itemsIndexed(data) { index, d -> ListItem(d) if (index != data.size - 1) { Divider() } } }
Ảnh động theo mục
Bạn có thể đặt ItemAnimator
trên RecyclerView
để tạo hiệu ứng ảnh động cho giao diện của
khi các thay đổi được thực hiện đối với bộ chuyển đổi. Theo mặc định, RecyclerView
sử dụng
DefaultItemAnimator
cung cấp ảnh động cơ bản khi xoá, thêm và
di chuyển sự kiện.
Danh sách Lazy có khái niệm tương tự thông qua đối tượng sửa đổi animateItemPlacement
.
Hãy xem bài viết Ảnh động mục để tìm hiểu thêm.
Tài nguyên khác
Để biết thêm thông tin về cách di chuyển RecyclerView
sang Compose, hãy xem
các tài nguyên sau:
- Danh sách và lưới: Tài liệu về cách triển khai danh sách và lưới trong Soạn thư.
- Jetpack Compose Interop: Sử dụng Compose trong RecyclerView:
Bài đăng trên blog về cách sử dụng Compose hiệu quả trong
RecyclerView
.
Đề xuất cho bạn
- Lưu ý: văn bản có đường liên kết sẽ hiện khi JavaScript tắt
- Danh sách và lưới
- Di chuyển
CoordinatorLayout
sang Compose - Những điểm khác cần cân nhắc