Tuỳ chỉnh RecyclerView nâng cao Một phần của Android Jetpack.

Bạn có thể tuỳ chỉnh đối tượng RecyclerView để đáp ứng các nhu cầu cụ thể của mình. Các lớp tiêu chuẩn được mô tả trong Tạo danh sách động bằng RecyclerView cung cấp tất cả các chức năng mà hầu hết các nhà phát triển đều cần; trong nhiều trường hợp, thao tác tuỳ chỉnh duy nhất bạn cần làm là thiết kế chế độ xem cho mỗi trình xem và viết mã để cập nhật các chế độ xem đó bằng dữ liệu thích hợp. Tuy nhiên, nếu ứng dụng có yêu cầu cụ thể, bạn có thể sửa đổi hành vi chuẩn theo một số cách. Trang này mô tả một số tuỳ chỉnh khác có thể áp dụng.

Sửa đổi bố cục

RecyclerView sử dụng trình quản lý bố cục để đặt các mục riêng lẻ trên màn hình và xác định thời điểm dùng lại chế độ xem mục không còn hiển thị với người dùng. Để dùng lại (hoặc khôi phục) một chế độ xem, trình quản lý bố cục có thể yêu cầu bộ chuyển đổi thay thế nội dung của chế độ xem bằng một phần tử khác với tập dữ liệu. Việc khôi phục chế độ xem theo cách này sẽ cải thiện hiệu suất do tránh phải tạo chế độ xem không cần thiết hoặc thực hiện các thao tác tra cứu findViewById() tốn công sức. Thư viện hỗ trợ Android bao gồm ba trình quản lý bố cục tiêu chuẩn, mỗi trình quản lý cung cấp nhiều tuỳ chọn tuỳ chỉnh:

Nếu không trình quản lý bố cục nào trong số này phù hợp với nhu cầu, bạn có thể tạo trình quản lý bố cục riêng bằng cách mở rộng lớp trừu tượng RecyclerView.LayoutManager.

Thêm ảnh động cho mục

Bất cứ khi nào một mục thay đổi, RecyclerView sẽ sử dụng trình tạo hình động để thay đổi giao diện của mục đó. Trình tạo hình động này là một đối tượng mở rộng lớp RecyclerView.ItemAnimator trừu tượng. Theo mặc định, RecyclerView sử dụng DefaultItemAnimator để cung cấp ảnh động. Nếu muốn cung cấp ảnh động tuỳ chỉnh, bạn có thể xác định đối tượng trình tạo hình động của riêng bạn bằng cách mở rộng RecyclerView.ItemAnimator.

Bật lựa chọn mục danh sách

Thư viện recyclerview-selection cho phép người dùng chọn các mục trong danh sách RecyclerView bằng thao tác nhấn hoặc nhập bằng chuột. Bạn duy trì quyền kiểm soát đối với bản trình bày trực quan của một mục đã chọn. Bạn cũng có thể duy trì kiểm soát các chính sách kiểm soát hành vi lựa chọn, chẳng hạn như các mục đủ điều kiện để chọn và số lượng mục có thể chọn.

Để thêm tính năng hỗ trợ lựa chọn cho thực thể RecyclerView, làm theo các bước sau:

  1. Xác định loại khoá lựa chọn để dùng, sau đó tạo một ItemKeyProvider.

    Có ba loại khoá mà bạn có thể dùng để xác định các mục đã chọn: Parcelable (và tất cả các lớp con như Uri), StringLong. Để biết thông tin chi tiết về các loại khoá lựa chọn, xem SelectionTracker.Builder.

  2. Triển khai ItemDetailsLookup.
  3. ItemDetailsLookup cho phép thư viện lựa chọn truy cập vào thông tin về các mục RecyclerView tuỳ theo MotionEvent. Đây thực sự là một nhà máy cho thực thể ItemDetails mà được sao lưu (hoặc trích xuất từ) thực thể RecyclerView.ViewHolder.

  4. Cập nhật mục Views trong RecyclerView để phản ánh rằng người dùng đã chọn hoặc bỏ chọn mục này.

    Thư viện lựa chọn không tạo trang trí hình ảnh mặc định cho các mục đã chọn. Bạn phải cung cấp thông tin này khi triển khai onBindViewHolder(). Phương pháp đề xuất là như sau:

  5. Sử dụng ActionMode nhằm cung cấp cho người dùng các công cụ để thực hiện thao tác với lựa chọn.
  6. Đăng ký SelectionTracker.SelectionObserver để được thông báo khi lựa chọn thay đổi. Khi một lựa chọn được tạo ra lần đầu tiên, bắt đầu ActionMode để giới thiệu điều này với người dùng và cung cấp các thao tác lựa chọn cụ thể. Ví dụ: bạn có thể thêm nút xoá vào thanh ActionMode và kết nối mũi tên quay lại trên thanh để xoá lựa chọn. Khi lựa chọn không hiển thị (nếu người dùng đã xoá lựa chọn vào lần gần đây nhất), đừng quên chấm dứt chế độ thao tác.

  7. Thực hiện mọi thao tác phụ đã được diễn giải
  8. Vào cuối quy trình xử lý sự kiện, thư viện có thể xác định rằng người dùng đang cố kích hoạt một mục bằng cách nhấn vào mục đó hoặc đang cố gắng kéo và thả một mục hoặc một tập hợp các mục đã chọn. Phản ứng với những diễn giải này bằng cách đăng ký trình nghe thích hợp. Để biết thêm thông tin, mời xem SelectionTracker.Builder.

  9. Tập hợp mọi thứ với SelectionTracker.Builder
  10. Ví dụ sau đây cho thấy cách kết hợp các phần này bằng cách sử dụng phím chọn Long:

    Kotlin

    var tracker = SelectionTracker.Builder(
        "my-selection-id",
        recyclerView,
        StableIdKeyProvider(recyclerView),
        MyDetailsLookup(recyclerView),
        StorageStrategy.createLongStorage())
            .withOnItemActivatedListener(myItemActivatedListener)
            .build()
    

    Java

    SelectionTracker tracker = new SelectionTracker.Builder<>(
            "my-selection-id",
            recyclerView,
            new StableIdKeyProvider(recyclerView),
            new MyDetailsLookup(recyclerView),
            StorageStrategy.createLongStorage())
            .withOnItemActivatedListener(myItemActivatedListener)
            .build();
    

    Để xây dựng thực thể SelectionTracker, ứng dụng của bạn phải cung cấp cùng một RecyclerView.Adapter mà bạn đã sử dụng để khởi chạyRecyclerView đếnSelectionTracker.Builder. Vì lý do này, rất có thể bạn cần chèn thực thể SelectionTracker sau khi được tạo vào RecyclerView.Adapter sau RecyclerView.Adapter được tạo. Nếu không, bạn sẽ không thể kiểm tra trạng thái của mục đã chọn bằng phương thức onBindViewHolder().

  11. Đưa lựa chọn vào sự kiện trong vòng đời hoạt động.
  12. Để duy trì trạng thái lựa chọn xuyên suốt các sự kiện trong vòng đời hoạt động, ứng dụng của bạn phải gọi các phương thức onSaveInstanceState()onRestoreInstanceState() của trình theo dõi lựa chọn từ phương thức onSaveInstanceState()onRestoreInstanceState() tương ứng của hoạt động. Ứng dụng của bạn cũng phải cung cấp một mã nhận dạng (ID) lựa chọn duy nhất cho hàm khởi tạo SelectionTracker.Builder. Mã nhận dạng này là bắt buộc vì một hoạt động hoặc một mảnh có thể có nhiều danh sách riêng biệt và lựa chọn được. Tất cả các danh sách này đều phải được duy trì ở trạng thái đã lưu.

    Tài nguyên khác

    RecyclerView được sử dụng trong ứng dụng minh hoạ Sunflower (Hoa hướng dương).