Khoá học: Thiết lập dự án Wordpress

Nếu bạn đang tìm kiếm một cách nhanh chóng và hiệu quả để thiết lập một trang web cá nhân hoặc doanh nghiệp của mình, hãy bắt đầu với WordPress. Được coi là nền tảng quản lý nội dung (CMS) phổ biến nhất trên thế giới, WordPress cho phép bạn dễ dàng tạo ra một [...]

Thủ thuật tối ưu tốc độ RecyclerView lồng nhau


Có thể coi RecyclerView là phiên bản cao cấp của ListView. Nó tái sử dụng view nhằm tránh việc tạo view mới, cung cấp trải nghiệm cuộn rất mượt mà. Để làm được điều này, RecyclerView đã tích hợp trong nó “View pool”, một công cụ giúp lưu trữ các view không còn hiển thị và có thể tái sử dụng. Hôm nay chúng ta cùng tìm hiểu về RecyclerView lồng nhau nhé!

Bạn có thể tham khảo thêm cách sử dụng RecyclerView tại đây: Hướng dẫn toàn tập RecyclerView trong Android

RecyclerView lồng nhau là gì?

Đôi khi chúng ta cần lồng các RecyclerViews vào với nhau để tạo bố cục hiển thị đúng yêu cầu khách hàng.

Mình lấy ví dụ phổ biến nhất chính là ứng dụng Google play. Ứng dụng này cũng sử dụng các RecycleView lồng nhau, khi RecyclerView ngang nằm trong RecyclerView dọc

Thủ thuật tối ưu tốc độ RecyclerView lồng nhau
RecyclerView lồng nhau trong ứng dụng Google Play

Như hình trên, bạn có thể thấy một danh sách cuộn dọc cho nhiều danh sách cuộn ngang..

Khi người dùng vuốt theo chiều ngang, mỗi RecyclerView bên trong sẽ tái sử dụng các views và cho bạn một trải nghiệm cuộn trơn tru.

Nhưng khi người dùng cuộn theo chiều dọc thì sao?

Khi đó, mỗi view của một RecyclerView bên trong sẽ lại được tăng thêm. Điều này xảy ra là do mỗi RecyclerView lồng nhau có một khung nhìn (view pool) riêng của nó.

Nếu không được tối ưu tốt, người dùng sẽ cảm thấy cuộn rất lag.

Và đây là cách

Tối ưu hiệu năng cho RecyclerView lồng nhau

Chúng ta có thể tối ưu bằng cách tạo một view pool duy nhất cho tất cả các RecyclerViews bên trong.

RecyclerView.setRecycledViewPool(RecycledViewPool) cho phép bạn thiết lập một view pool tùy chỉnh cho RecyclerView.

Bạn cần code lại như sau

public OuterRecyclerViewAdapter(List<Item> items) {
    //Constructor stuff
    viewPool = new RecyclerView.RecycledViewPool();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //Create viewHolder etc
    holder.innerRecyclerView.setRecycledViewPool(viewPool);
    
}

Khi đó các RecyclerViews bên trong có cùng một view pool. Với cách làm này sẽ giúp RecyclerView có thể sử dụng lịch sử view của nhau, từ đó cải thiện đáng kể hiệu năng

Như vậy, qua bài viết này, mình đã chia sẻ với các bạn thủ thuật rất nhỏ nhưng có tác dụng rất lớn, giúp ứng dụng của bạn luôn có trải nghiệm tốt nhất

Nếu thấy bài viết có ích thì đừng quen chia sẻ cho mọi người cùng đọc nhé

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *