Android

Sử dụng RecyclerView trong Android

Giới thiệu

RecyclerView là một ViewGroup mới được giới thiệu trong Android L (Android API 21). Đây là một ViewGroup có chức năng tương tự ListView nhưng nó tỏ ra mạnh mẽ, linh hoạt hơn rất nhiều. ListView chỉ hỗ trợ bạn scroll các item trong ListView theo chiều dọc (vertical) mà không hỗ trợ scroll theo chiều ngang (horizontal) . RecyclerView support được tất cả những thứ đó và hơn thế nữa. Trong bài viết này tôi sẽ giới thiệu cho các bạn về một ViewGroup này.

Trước khi đi vào tìm hiểu RecyclerView mình khuyên các bạn nên đọc lại 3 bài viết về ListView từ cơ bản tới nâng cao:

ListView trong Android Phần 1

ListView trong Android Phần 2

ListView Multiple Selection và ListView Single Selection trong Android

RecyclerView so với ListView

So với ListView thì RecyclerView có những điểm mạnh mẽ vượt trội hơn như sau:

+ Yêu cầu sử dụng ViewHolder Pattern trong Adapter: Với ListView chúng ta không cần sử dụng ViewHolder pattern để cải thiện performance của ListView nhưng ngược lại khi chúng ta tạo một Adapter sử dụng với RecyclerView bắt buộc phải sử dụng ViewHolder để cải thiện performance.

Mục đích sử dụng ViewHolder để tái sử dụng View nhằm tránh việc tạo View mới và findViewById quá nhiều

+ ListView chỉ support cho chúng ta danh sách dạng scroll dọc. Nhưng với RecylerView cung cấp cho chúng ta RecyclerView.LayoutManager cho phép Layout các item trong listView theo các kiểu khác nhau (ngang, dọc, dạng grid, dạng staggered grid).

+ Với ListView việc xử lý animation cho các item trong ListView không hề dễ dàng. Nhưng đối với RecyclerView có hổ trợ ItemAnimator giúp chúng ta có thể xử lý animation khi add hay remove một item ra khỏi Recycler một cách dễ dàng. Mặc định RecyclerView sử dụng DefaulItemAnimtor.

+ Với ListView việc sử dụng divider không được linh hoạt nhưng với RecylerView có hỗ trợ ItemDecoration cho phép chúng ta draw divider một cách tuỳ thích.

+ ListView có support các phương thức phương thức setOnItemClickListener và setOnLongItemListener để chọn 1 item trong ListView. Nhưng RecylerView chỉ support một phương thức đó là onItemTouchListener.

Các thành phần khi sử dụng RecyclerView

Khi sử dụng RecyclerView chúng ta phải làm việc với những thành phần sau đây:

RecyclerView.Adapter

Cũng giống như ListView thì đây là thành phần xử lý data collecion (dữ liệu kiểu danh sách) và bind (gắn) những dữ liệu này lên các Item của RecyclerView.

Khi tạo custom Adapter chúng ta phải override lại hai phương thức chính là:

onCreateViewHolder: Phương thức dùng để tạo view mới cho RecyclerView. Nếu RecyclerView đã cached lại View thì phương thức này sẽ không gọi.

onBindViewHolder: Phương thức này dùng để gắn data và view.

LayoutManager

Là thành phần có chức năng sắp xếp các item trong RecylerView. Các item scroll dọc hay ngang phụ thuộc chúng ta set LayoutManager này cho RecyclerView.

Các class con của LayoutManager:

LinenarLayoutManager: Hỗ trợ scroll các item theo chiều ngang hay chiều dọc.

GridLayoutManager: Layout các item trong RecyclerView dưới dạng Grid giống như khi chúng ta sử dụng GridView.

StaggerdGridLayoutManager: Layout cá item trong ListView dưới dạng Grid so le.

ItemAnimator: Là thành phần hỗ trợ animation khi chúng ta add hay remove một item ra khỏi RecyclerView. Tôi sẽ hướng dẫn chi tiết về ItemAnimator trong bài viết sau. Để tìm hiểu rõ phần này tôi gọi ý cho các bạn là nên tìm hiểu các class sau

ItemAnimator: Là class đại diện, khung sườn của animation trong RecyclerView.

SimpleItemAnimator: class wrapper lại ItemAnimator.

DefaultItemAnimtor: class xử lý animtion mặc định sử dụng trong RecyclerView.

Sử dụng RecyclerView trong Android

Mặc định RecyclerView không có sẵn trong Android SDK mà chúng ta phải import thư viện. Các import thư viện bạn chỉ cần paste dòng dưới đây vào build.gradle của module app sau đó nhấn Sync Now để Andorid Studio download và nạp thư viện tự động cho chúng ta.

Hoặc có một cách khác là chúng ta vào File > Project Structure 

Chọn module app và chuyển sang tab Dependencies. Sau đó nhấn vào dấu vào chọn Library Dependencies

Tìm thư viện RecyclerView sau đó nhấn OK để import thư viện:

recyclerview-android-0

Sau khi đã import thư viện chúng ta bắt đầu tìm hiểu cách sử dụng RecyclerView nhé!

Các bước tôi sẽ làm như sau:

  1. Tạo model class để chứa data
  2. Thêm RecyclerView vào main_activity.xml
  3. Tạo giao diện cho một row
  4. Tạo Custom Adapter và gán dữ liệu cho từng row trong Adapter
  5. Setup RecyclerView trong MainActivity.java

Bước 1: Tạo model để chứa data

Class Song đại diện cho 1 bài hát gồm các thông tin:

  • mCode: Mã số bài hát
  • mTitle: Tên bài hát
  • mLyric: Lyric của bài hát.
  • mAstist: Tên ca sĩ

File Song.java

Bước 2: Thêm RecyclerView vào main_activity.xml

File main_activity.java

Bước 3: Tạo giao diện cho một row

File row_item_song.xml trong thư mục layout của project được thiết kể để hiển thị row như hình dưới đây:

listview-advanced-0

Và mã nguồn của file này:

Bước 4: Tạo Custom Adapter và bind dữ liệu cho từng row trong Adapter

Chúng ta thấy rằng tạo tạo Custom Adapter trong RecyclerView thực sự dễ dàng hơn so với ListView. Chỉ cần tạo một class kế thừa RecyclerView.ViewHolder và việc còn chị chỉ cần xử lý trong onCreateViewHolder để tạo mới ViewHolder và onBindViewHolder để gán data lấy từ collection gán vào ViewHolder.

Bước 5: Setup RecyclerView trong MainActivity.java

Không giống như ListView chúng ta chỉ cần set Adapter cho ListView là đủ nhưng đối với RecyclerView chúng ta phải set 2 thành phần bắt buộc dưới đây:

+ set adapter cho RecyclerView sử dụng phương thức setAdapter

+ set layout manager để chỉ ra chúng ta muốn layout các item như thế nào (vertical, horizotal, grid, staggered grid) bằng cách sử dụng phương thức setLayoutManager.

Source file MainActivity.java

Các bạn chú ý đến đoạn mã

Vì tôi muốn RecyclerView của tôi cuộn theo chiều dọc nên tôi sử dụng LinearLayoutManager và truyền vào constructor là VERTICAL.

Nếu bạn muốn cuộn theo chiều ngang thì có thể set là

Các bạn có thể sử dụng những class sau để setLayoutManager cho RecyclerView.

GridLayoutManager: Layout các item trong RecyclerView theo dạng grid.

StaggeredLayoutManager: Layout các item trong RecyclerView theo dạng grid so le nhau.

Select item trong RecyclerView

Chúng ta có thể select item trong RecyclerView bằng cách setOnClickListenner cho itemView trong Constructor của ViewHolder như sau:

Và dưới đây là video demo:

Source code sử dụng trong bài viết: RecyclerViewAndroid

 

22 thoughts on “Sử dụng RecyclerView trong Android”

  1. Nếu như muốn khi chọn vào một item đồng thời một item trong đó cũng thay đổi thì mình làm sao bạn?

      1. Mình xài Gridlayout, các ô của mình màu trắng, mình chọn bất kỳ một ô thì sẽ chuyển sang màu xanh sau đó mình chọn ô mới thì ô đó chuyển sang màu xanh, ô ban đầu quay về màu trắng. Mình biết cách lấy vị trí của từng ô nhưng chưa biết cách để làm được điều ở trên bạn :((, bạn có thể giúp mình không?

  2. Ad giải đáp giúp mình nhé. Như cái listview thì có cái để kiểm tra convertview đã tạo hay chưa. Nhưng cái này mình không hiểu cách nó kiểm tra item trên RecyclerView đã tạo chưa bằng cách nào?

    1. RecyclerView luôn bắt buộc có class phụ VH extends ViewHolder rồi, và bản thân nó sẽ tự recycle lại nên việc kiểm tra if (convertView == null) trong getView(…) được tự nó làm, bạn không cần phải tự kiểm tra.

      1. oh ra vậy, bạn cho mình hỏi thế lần đầu tiên tạo thì RecyclerView nó sẽ tạo hết các phần tử trong danh sách hay chỉ tạo những phần tử mình có thể nhìn được thôi?

        1. Mặc định, nếu bạn không xác định lượng cache thì nó sẽ căn cứ vào bộ nhớ của hệ thống cấp cho ứng dụng mà sẽ tính toán, tạo cache số lượng các items cho phù hợp. Nhưng bao giờ thì lượng items đó cũng lớn hơn hoặc bằng số phần tử bạn thấy. Tuy nhiên bạn vẫn yêu cầu nó tạo số lượng cached items theo ý bạn vẫn được. Vd: Trong ArrayList nguồn có 200 elements, nhưng trên màn hình có 10 items thấy được, thì số cached items mặc định ít nhất là 10, nhưng bạn vẫn có thể yêu cầu nó định lượng số items này là 11, 20, 35 hay 200.

          1. Mình hiểu cách làm việc của nó như này, nếu có sai bạn sử giúp mình nhé. Trong t.h màn hình chỉ chiứa được 10 item Adapter sẽ tạo 1 số lượng view nhất định (ít nhất có thể) để tiết kiệm bộ nhớ. Sau đấy RecyclerView yêu cầu item nào, adapter sẽ bind data lên các view đã có. Còn về cơ chế tái sd, ví dụ khi ta scroll tới item nào thì nó sẽ lấy lại cái view của item bị remove rồi setData lại đúng không bạn? Sr nếu mình nói không thoát ý.

          2. Always welcome. Chúc bạn sẽ tìm được những kiến thức bạn đang cần trên EITGUIDE.

  3. Việc k sử dụng static cho class songViewHolder có lẽ sẽ làm giảm hiệu suất của ứng dụng khi có một lượng dữ liệu lớn?!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.