Sử dụng MergeAdapter trong Android

Tram Ho

Giả sử nếu bạn được đưa cho một giao diện người dùng như sau và bạn được yêu cầu để thiết kế nó, suy nghĩ đầu tiên sẽ xuất hiện trong đầu bạn là gì?

Bạn có thể đưa ra một loạt các ý tưởng khác nhau để thực hiện nó. Nhưng ý tưởng phổ biến nhất sẽ là sử dụng RecyclerView với nhiều kiểu view type trong một RecyclerView.

Nhưng với giải pháp được đưa ra ở trên, vấn đề nảy sinh chính là việc quản lý nhiều view type khá là phức tạp. Trong ví dụ trên, chúng ta chỉ có ba loại view type. Nhưng trong thực tế, bạn có thể sẽ phải quản lý rất nhiều view type mà không chỉ là ba.

Vậy làm thế nào chúng ta có thể thiết kế một view một cách dễ dàng mà không phải quản lý các view type khác nhau?

MergeAdapter chính là là giải pháp cho vấn đề này.

Trong bài viết này, chúng ta sẽ sử dụng MergeAdapter để xây dựng màn hình trên.

Bước 01

Trước tiên, chúng ta hãy thêm dependency của merge adapter (nó là một phần của recyclerView) vào trong build.gradle của ứng dụng:

Bước 02

Đối với màn hình ở trên, chúng ta có ba loại View khác nhau. Vì vậy, chúng ta cần tạo ra ba data class khác nhau – User, MyDetail, Banner.

Bước 03

Trong phần này, chúng ta sẽ tạo nguồn dữ liệu cho danh sách người dùng để hiển thị danh sách. Vì thế, chúng ta sẽ tạo một đối tượng của DataSource và trong đó:

Trong đó getUser() sẽ được sử dụng để lấy danh sách người dùng và getBanner() được sử dụng để lấy hình ảnh banner từ thư mục drawable.

Bước 04

Ở bước này, ta sẽ tạo ra 3 adapter cho 3 kiểu View cần thiết.

Để hiển thị MyDetails, ta sẽ tạo MyDetailAdapter:

Adapter này sẽ được sử dụng để hiển thị MyUserDetails, về cơ bản là phần đầu tiên của danh sách. Ở đây, R.layout.item_layout_my_detail sẽ như sau:

Sau đó, để hiển thị danh sách người dùng, chúng ta sẽ tạo ra một adapter khác ods là UsersAdapter:

Adapter này sẽ được sử dụng để hiển thị danh sách người dùng, trong đóR.layout.item_layout sẽ như sau:

và cuối cùng, ta sẽ tạo một adapter để hiển thị banner đó là BannerAdapter:

File R.layout.item_layout_banner:

Bây giờ, chúng ta đã hoàn thành việc thiết kế ba adapter để hiển thị 3 loại view khác nhau trên reycler view.

Bước 05

Bây giờ, để có thể sử dụng các adapter mà chúng ta tạo trong MergeAdapter, trước tiên, ta sẽ tạo MainActivity làm launcher activity:

File R.layout.activity_main:

Bây giờ, ta cần thêm 4 biến ở trong MainActivity:

chúng ta cũng sẽ tạo một biến khác sẽ được cấu trúc theo lớp dữ liệu MyDetail và chứa thông tin chi tiết của người dùng,

Tiếp theo, chúng ta cần tạo ra một phương thức để khởi tạo những thứ liên quan tới recycler view:

Tại đây, chúng ta sẽ khởi tạo các adapter và truyền dữ liệu cần thiết cho mỗi adapter.

Lưu ý: Thứ tự mà chúng ta truyền vào các adapter sẽ quy định thứ tự hiển thị trên danh sách của view tương ứng trên recycler view.

Khi bạn chạy ứng dụng, bạn sẽ có giao diện mà mình mong muốn:

Đây là cách bạn có thể thiết kế recyclerView với nhiều view type theo cách tuần tự bằng cách sử dụng dữ liệu từ các bộ adapter riêng lẻ.

Điểm cần nhớ:

  • Giả sử nếu chúng ta cần sử dụng một loại adapter nhiều lần trong recycler view thì ta có thể tạo ra nhiều instance cho adapter đó và truyền vào hàm khởi tạo của MergeAdapter.
  • Chúng ta nên thực hiện logic trong từng adapter riêng.
  • Khi chúng ta cập nhật dữ liệu trong bất kì adapter nào sử dụng notifyDataSetChanged() thì merge adapter cũng sẽ gọi phương thức notifyDataSetChanged() của nó.
  • Thay vì truyền vào các adapter một cách riêng rẽ, ta có thể truyền vào một danh sách các adapter, ví dụ:

và ở trong hàm khởi tạo, ta có thể truyền như sau:

Hãy nói thêm về một use case khác

  1. Nhìn chung, ta sử dụng một view holder cho một adapter. Nhưng trong một số trường hợp khi ta cần phải tái sử dụng view holder cho nhiều adapter thì ta cần phải truyền vào một config trong hàm khởi tạo, ở đó ta phải set isolateViewTypes thành false.

Để tạo một config:

và ở trong MergeAdapter, ta truyền như sau:

Tương tự ở đây, ta có thể truyền một danh sách các adapter:

  1. Giả sử, chúng ta không muốn truyền adapter vào trong hàm khởi tạo mà muốn thêm nó vào một lúc bất kì nào đó vào trong MergeAdapter, ta có thể làm như sau:

Việc này sẽ thêm adapter vào vị trí cuối cùng danh sách. Nếu bạn muốn thêm adapter này vào một vị trí cụ thể, hãy làm như sau:

Ở đây, chúng ta đã thêm một adapter ở vị trí thứ 0, tức là bắt đầu danh sách. Bây giờ, recyclerView sẽ như sau:

  1. Tương tự, để xóa một adapter:

  1. Để lấy ra số lượng item trong recyclerView từ tất cả các adapter ta sử dụng:

  1. Để lấy ra danh sách các adapter được thêm vào, sử dụng:

Đây là cách bạn có thể sử dụng MergeAdapter thay cho việc quản lý nhiều view type trong recycler view.

Nguồn: https://blog.mindorks.com/implementing-merge-adapter-in-android-tutorial

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo