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
- 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 Layout
và Grid 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ủaListView
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ằngRecyclerView
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ủaRecyclerView
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ùngRecyclerView
ngay và luôn.
http://blog.appconus.com/