Hiệu suất của việc đóng gói nội dung trong RecyclerView

Hiệu suất của việc đóng gói nội dung trong RecyclerView

Note :

Khi mà RecyclerView đang đóng gói thông tin của nó, nó sẽ không tái chế nữa. Mọi bản ghi trong bộ dữ liệu đều có một mục View được lưu trong bộ nhớ miễn là RecyclerView nằm trong bố cục layout.

***Giải thích : ***

Ý tưởng căn bản của một RecycleView rất đơn giản.

  1. Bạn có một scrollable chứa những item Views.
  2. Khi một item view được kéo ra khỏi vùng hiển thị, RecyclerView sẽ đưa nó ra khỏi component.
  3. Những item được đẩy ra ngoài, sẽ có thể được sử dụng để show một item view khác trong khu vực hiển thị của cuộn. Mọi thứ sẽ trở nên khó hình dung hơn khi bạn muốn RecyclerView bao bọc nội dung của nó. Trong trường hợp đó kích thước của RecyclerView trở thành kích thước của tất cả các itemview. Do đó, RecyclerView không thể scroll lại được nữa và không có một item nào có thể được cuộn ra khỏi khu vực của RecyclerView. RecyclerView coi toàn bộ diện tích của nó là một khu vực có thể nhìn thấy được. Tất cả điều này dẫn đến một thực tế đơn giản: nếu không có item nào được cuộn ra, thì sẽ không có item nào được tái sử dụng. All of them cần có sẵn mọi lúc. All item Views được giữ trong bộ nhớ miễn là RecyclerView của bạn nằm trong the layout hierarchy. Nếu RecyclerView của bạn hiển thị một mục cho mỗi hàng duy nhất của bảng cơ sở dữ liệu của bạn, sau đó nếu bảng này có 726 rows, bạn sẽ kết thúc có 726 item Views được load trong bộ nhớ cùng một lúc. Về cơ bản, bạn có thể kết thúc với một thành phần tạo ra một số Views bằng cách sử dụng Adapter từ một số loại tập dữ liệu. Nhưng hiệu suất của các Views giống như bạn sẽ chỉ dùng tay để thêm tất cả các views trong một ScrollView. Không có chút hiệu suất đạt được từ RecyclerView .

Example: Assuming the layout:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
           android:layout_width="match_parent"
           android:layout_height="100dp"
           android:scaleType="centerCrop"
           android:src="@drawable/test_image"/>
        
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#3F51B5"
            android:text="Example"/>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"/>
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

And items being inflated in the RecyclerView:

<TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

Nếu Adapter cho RecyclerView có 30 bản ghi trong bộ dữ liệu của nó, màn hình có thể trông (và hoạt động) như sau:

Ngay từ cái nhìn đầu tiên mọi thứ đều có vẻ tốt, nhưng nếu bạn nhìn vào thứ bậc Giao diện (trong công cụ Trình giám sát bố cục), bạn có thể thấy: Mọi mục Xem từ RecyclerView đều được giữ trong bộ nhớ mọi lúc. Bao gồm nhiều chế độ xem mặt hàng hiện không hiển thị (chụp trình phân cấp bố cục được thực hiện với NestedScrollView cuộn lên tất cả các cách trên cùng). Bạn có thể so sánh nó với một trường hợp tương đương khi không có NestedScrollView và RecyclerView không gói nội dung của nó (cùng một tập dữ liệu):

Tại bất kỳ điểm thời gian nào, Các Views sẽ được giữ duy nhất trong bộ nhớ thể hiện các mục hiện tại trong phạm vi của Scroll (của RecyclerView).

Nếu bạn thích bài đăng này, vui lòng cho biết sự hỗ trợ của bạn! Đề xuất, theo dõi, nhận xét, chia sẻ. Điều này thực sự có ý nghĩa rất nhiều!

Bài viết được tham khảo tại AndroidPub !