So sánh RecyclerView và ListView trong android

Trong phiên bản API 21 thì Google đã cho ra mắt một loại widget mới mà họ giới thiệu đó như là một bản nâng cấp xịn nhưng cũng phức tạp hơn của ListView, đó là RecyclerView. Chắc hẳn các bạn cũng đã từng nghe qua nó đúng không. Bản thân mình khi code mà cần đụng đến list cũng rất ngại phải dùng đến RecyclerView vì dùng ListView vẫn có đầy đủ những chức năng ấy, vừa code quen tay rồi lại còn dễ làm hơn nữa. Nhưng sau này khi gặp một số project có giao diện phức tạp thì mình đã phải đụng đến thằng cha rắc rối RecyclerView này. Bài viết này mình chỉ mong chia sẻ một số thông tin hữu ích để các bạn có thể mạnh dạn mà dùng nó nhé ?

Muốn sử dụng nó thì các bạn add thư viện này vào nhé:

compile ‘com.android.support:recyclerview-v7:version’

Khái báo trong file xml:

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

II. Lợi thế

   1. ViewHolder Design Pattern là mặc định

Đây chính là nguyên nhân chính là nó có tên là Recycle (tái sử dụng) Thật sự là mình rất thích sự tích hợp này. Mình tin rằng các bạn đều đã nghe qua ViewHolder pattern và dùng chúng trong ListView (bạn nào chưa dùng thì thử dùng ngay sau khi đọc bài này nhé :D), . Trong RecyclerView, bạn sẽ phải áp bắt buộc phải tạo ViewHolder của riêng mình và kế thừa  RecyclerView.ViewHolder, tuy rắc rối hơn một chút nhưng luôn đảm bảo cho ListView của chúng ta được tối ưu một cách tốt nhất. (bác gu gồ đã ép thì cấm có cãi)

   2. LayoutManager

Đối với ListView, bạn chỉ có thể thiết kế để nó cuộn lên xuống, còn muốn cuộn ngang thì bắt buộc phải dùng đến thư viện bên ngoài. Bây giờ thì quên nó đi, khỏi cần thêm thư viện cho rắc rối vì RecyclerView đã đem đến cho bạn rất nhiều sự lựa chọn với LayoutManager. Có các loại LayoutManager như sau bạn có thể tùy chọn trong trường hợp của mình đó là:

  • LinearLayoutManager – loại này giúp bạn có thể tạo list cả chiều dọc (vertical) và chiều ngang (horizontal), điều mà ListView không làm được ?
  • StaggeredLayoutManager – giúp bạn tạo một list so le các kiểu như hình dưới đây

so-sanh-recycelview-listview

  • GridLayoutManager – giúp bạn tạo một list đều tăm tắp.

Bạn nào còn lăn tăn về sự khác nhau giữa Staggered LayoutGrid Layout thì vào đây xem nhé. Thật tuyệt khi bạn có thể tạo ra chúng một cách dynamically đúng không nào.

   3. Item Animator

Bạn đang đang chán vì ListView của bạn khi xóa chỉ biến mất, bạn đang buồn đời vì muốn làm màu mè tí thì phải lùng sục trên tìm trong cả chục cái library rồi apply vào thử. Với RecyclerView thì bạn đã có class ItemAnimator giúp đỡ, đây là điều Google đã bù đắp cho những gì mà ListView thiếu sót ?

   4. Item Decoration

Thực sự thì mình không biết đây là điểm tiện lợi hay bất tiện nữa, ví dụ khi bạn muốn custom một divider cho ListView, bạn chỉ cần custom một file drawable cho nó rồi sau đó add trực tiếp vào layout thì với RecyclerView bạn phải tự làm điều đó với class ItemDecoration này, khác rắc rối và phức tạp hơn. Mình nghĩ điểm mạnh có thể gỡ gạc lại là bạn dễ control hơn so với phiên bản cũ.

Tạo một custom class của ItemDecoration

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;
    public DividerItemDecoration(Drawable divider){ 
        mDivider = divider; 
    }

Và sau đó add nó vào trong RecyclerView

RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecoration(dividerDrawable);
recyclerView.addItemDecoration(dividerItemDecoration);

5. OnItemTouchListener

Đây là một trong những thay đổi khó chịu nhất, loại bỏ onClickListener trên RecyclerView, nhưng bù lại chúng ta đã có OnItemTouchListener, một sự lựa chọn khá tốt. Mình sẽ có bài viết đi sâu hơn về cách sử dụng nó đối với RecyclerView, các bạn có thể theo dõi ?

III. Những điểm bất tiện

  • Rắc rối hơn ListView : chắc chắn rồi, chính Google cũng nói vậy mà :)) nhưng cái gì cũng có cái giá của nó, bạn sẽ dễ dàng control nó hơn.
  • Khó quá mà mình mới học Android thôi xài ListView cho khỏe : vì đây là một API mới ra mắt và được Google chăm sóc rất kỹ nên hứa hẹn sẽ thay thế ListView trong một tương lai không xa. Các bạn tìm hiểu về nó không bao giờ thừa đâu nhé.
  • Hàm onClickListener bị remove: như đã nói ở trên mình sẽ có một bài riêng về điều này.

IV. Câu hỏi thường gặp

  • RecyclerView sinh ra để thay thế ListView? – Mình nghĩ là có, vì nó bao gồm những tính năng của ListView và kèm theo rất nhiều chức năng mở rộng.
  • Mình có nên thay thế các ListView của mình bằng RecyclerView không? – Câu trả lời là nên nhưng không phải tất cả, vì đây vẫn chưa phải là phiên bản cuối cùng của RecyclerView nên các bạn cũng nên cẩn thận một chút với những đoạn code cũ. Còn đối với các đoạn code mới thì mình khuyên các bạn nên dùng RecyclerView ngay và luôn.

http://blog.appconus.com/

 

Nguyễn Linh

Chia sẻ để cùng tiến bộ...