Di chuyển RecyclerView sang danh sách Lazy

RecyclerView là một thành phần Khung hiển thị giúp bạn dễ dàng hiển thị các tập dữ liệu lớn một cách hiệu quả. Thay vì tạo thành phần hiển thị cho từng mục trong tập dữ liệu, RecyclerView sẽ cải thiện hiệu suất của ứng dụng bằng cách giữ một nhóm nhỏ các thành phần hiển thị và tái chế thông qua chúng 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:

  1. Nhận xét hoặc xoá RecyclerView khỏi hệ phân cấp giao diện người dùng và thêm một ComposeView để thay thế nếu chưa có trong hệ phân cấp. Đâ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>
    
  2. 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 bạn chọn sẽ là thành phần kết hợp cấp cao nhất của ComposeView mà bạn đã thêm ở bước trước.

    LayoutManager

    Thành phần kết hợp

    LinearLayoutManager

    LazyColumn hoặc LazyRow

    GridLayoutManager

    LazyVerticalGrid hoặc LazyHorizontalGrid

    StaggeredGridLayoutManager

    LazyVerticalStaggeredGrid hoặc 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
        }
    }

  3. 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 quá trình triển khai RecyclerView.Adapter. Mỗi loại khung hiển thị thường liên kết với một lớp con ViewHolder, mặc dù không phải lúc nào cũng như vậy. Các thành phần kết hợp này sẽ được dùng làm đại diện cho giao diện người dùng cho nhiều loại phần tử 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 các phương thức onCreateViewHolder()onBindViewHolder() của RecyclerView.Adapter sẽ được thay thế bằng các thành phần kết hợp này và trạng thái mà bạn cung cấp. Trong Compose, không có sự phân tách giữa việc tạo thành phần kết hợp cho một mục và liên kết dữ liệu vào mục đó – các khái niệm này được hợp nhất.

  4. Trong khe content của danh sách Lazy (tham số lambda theo sau), hãy sử dụng hàm items() (hoặc một phương thức nạp chồng tương đương) để lặp lại dữ liệu cho danh sách của bạn. Trong hàm lambda itemContent, hãy gọi mục thành phần kết hợp thích 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 ranh giới 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 mọi thành phần trang trí giao diện người dùng vào danh sách trong thành phần kết hợp. 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 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 ảnh động cho giao diện của các mục khi bộ chuyển đổi được thay đổi. Theo mặc định, RecyclerView sử dụng DefaultItemAnimator để cung cấp ảnh động cơ bản trong các sự kiện xoá, thêm và di chuyể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: