RecyclerView và ViewHolder trong Android Studio
Khóa học lập trình Android cơ bản

Danh sách bài học
RecyclerView và ViewHolder trong Android Studio
Nội dung bài viết Học nhanh
Dẫn nhập
Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về LISTVIEW TRONG ANDROID, và được biết nó là một View đặc biệt, có thể chứa danh sách các phần tử giống nhau, cũng như cách cài đặt khá là “dị” của nó để có thể show ra được những gì mình mong muốn.
Nhưng chưa hết! Ví dụ lần trước mình đưa ra khá là dở, dở ở đâu? Chúng ta sẽ cùng xem lại trong bài này và mình cũng sẽ hướng dẫn các bạn sử dụng một loại View khác cũng hỗ trợ hiển thị danh sách rất mạnh là RecyclerView.
Nội dung
Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:
- LISTVIEW TRONG ANDROID
- Model hay POJO trong Java là gì.
- Adapter của ListView là gì.
Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:
- ViewHolder.
- RecyclerView và điểm khác của nó so với ListView.
Nào, chúng ta cùng vào vấn đề thứ nhất. Bài viết này được tấu bằng phong cách lãng khách nên sẽ hơi dị một chút, mọi người cùng thưởng thức!
ViewHolder
Tương truyền từ thời API 23, có một tay sát thủ khét tiếng đất Android. Tên hắn ai cũng biết, nhưng khuôn mặt của hắn muôn hình vạn trạng, biến đổi khôn lường.
Trong một quán rượu, mọi người xì xầm to nhỏ về chủ đề ListView, tay hảo hán trong giới View của Android, và được nhắc đến rất nhiều tại đại hội võ lâm Google I/O năm 2010.
Hẵng khoan, đã bao giờ các hạ tự hỏi rằng, liệu với những danh sách gồm rất nhiều phần tử, khoảng vài ngàn trở lên chẳng hạn, thì với mỗi item XML trong ListView chúng sẽ được xử lý ra sao không?
Quay lại ví dụ trước, chúng ta có hảo hán ListView với vũ khí là Adapter đại pháp:
- “Dở, quá dở!” – Một bô lão của Android đại lục lên tiếng.
Trong quán rượu, mọi người xì xầm to nhỏ. Tên tiểu nhị lớn tiếng hỏi:
- “Sao dở? Adapter quả thực rất mạnh. Một mình nó cũng đủ điều khiển hàng vạn tinh binh kia mà!”.
Người chê dở khi nãy lộ mặt. Hắn dùng cây thư pháp của mình quét lên bàn rượu như hạc lướt mặt nước:
- “Mỗi lần tạo ra một phần tử để hiển thị, nó sẽ phải duyệt qua các cấp của View (trong item_name.xml) và mỗi lần như vậy, hàm findViewById() lại được triệu gọi, mặc dù view vẫn chỉ có item_name.xml. Thử tưởng tượng với một danh sách dài khoảng vài ngàn phần tử, mỗi lần phải gọi như vậy thì lãng phí cỡ nào????”
Thật ra thì việc này hoàn toàn có thể được bằng cách sử dụng cơ chế ViewHolder: Gán cứng view để nó inflate file xml, dữ liệu sau đó chỉ việc đổ vào mà không tạo ra các layout con mới, thêm class con này vào trong DataAdapter.java:
Tuy nhiên về bản chất thì ListView không ngăn cấm việc không sử dụng ViewHolder. Dù khá tự do nhưng về hiệu năng thì không ổn. Hơn nữa ListView chỉ có thể hiển thị danh sách dạng xếp dọc (Vertical Scrolling).
Từ phiên bản Android Support Library 23.2, Google đã bổ sung thêm RecyclerView vào thư viện hỗ trợ. Với một số đặc tính như:
- Buộc sử dụng ViewHolder để tái sử dụng xml item cho mỗi phần tử, tăng tốc hiệu năng cho danh sách.
- Có thể sử dụng nhiều item type, và đương nhiên là với ViewHolder thì ta cũng có thể tái sử dụng nó.
- Không chỉ hỗ trợ dạng danh sách dọc, RecyclerView còn hỗ trợ dạng Grid, dọc, ngang đủ cả.
Hảo hán ListView tức giận, thách đấu với lão già dám ngang nhiên chê mình giữa thanh thiên bạch nhật. Lão già kia hiện nguyên hình là RecyclerView. Hai bên kẻ tám lạng người nửa cân thách đấu giao kèo: Mục tiêu là
Hiển thị một danh sách đơn giản, nhưng danh sách này gồm 2 loại phần tử từ cùng mộ model là Person, hiện thị màu theo giới tính (nam là đen, nữ là hồng)
Và trận thư hùng bắt đầu!
RecyclerView và ListView
Hồi 1: Ban giám khảo tạo một project mới lấy tên RecyclerViewExample như thường lệ, và vẫn để Empty Activity:
Để có thể khai triển tuyệt kỹ, RecyclerView cần được thêm vào file build.gradle của app module như sau:
compile 'com.android.support:recyclerview-v7:24.2.1'
Hồi 2: Hai bên cùng tỉ thí trong activity_main.xml:
- Activity_main.xml (của RecyclerViewExample):
So sánh với của ListViewExample:
- Activity_main.xml (của ListViewExample):
Vậy là cách khai báo của hai bên đều như nhau, không có gì khác!
Tiếp theo, triển khai layout cho từng kiểu item:
- Item_names.xml
- Item_name_female.xml
Lưu ý: Thuộc tính textColor ở trên có thể thay bằng mã màu hexa với dấu # đằng trước, ví dụ #FFFFFF
Hồi 3: RecyclerView xuất chiêu, hắn có riêng cho mình một class Adapter, chỉ việc extends từ nó:
Và chọn Code > Implement Methods để chèn những method cần thiết:
Và thiên hạ thấy được:
Nhưng khoan, cái gì kia?
Đúng! Tuyệt kỹ của RecyclerView luôn đi kèm một ViewHolder, dưới dạng một inner static class. Vì thế để thi triển tốt nhất, cần định nghĩa một class ViewHolder static trong RecyclerDataAdapter.
Hồi 4: Lúc này việc tạo model là cần thiết để có thể hiển thị nhiều loại dữ liệu. Tạm lấy một model là Person và có 2 thuộc tính là tên và giới tính:
- Person.java
Hồi 5: Quay lại với RecyclerAdapter, để thi triển tuyệt chiêu nhiều kiểu item type, RecyclerView có sẵn phương thức getItemViewType để lấy ra kiểu View tương ứng. Nội dung đầy đủ như sau:
Hồi 6: Quay lại với MainActivity, lúc này chỉ việc truyền vào bên trong Adapter đã khởi tạo, cùng với danh sách Person với đủ loại giới tính: Nam / nữ:
Toàn bộ những class và layout cần thiết được liệt kê như trong hình:
Và thế là danh sách cấu thành bằng RecyclerView đã hoàn tất:
Kết luận
Qua bài này chúng ta đã nắm được hàm là gì, cách sử dụng hàm, các từ khóa và các đặc tính đi kèm của hàm.
Bài sau chúng ta sẽ tìm hiểu về GIAO DIỆN TRƯỢT NGANG VỚI VIEWPAGER & TAB TRONG ANDROID CƠ BẢN.
Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học RecyclerView và ViewHolder trong Android Studio dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!

Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Tác giả/Dịch giả
Khóa học
Khóa học lập trình Android cơ bản
Serial tutorial hướng dẫn lập trình Android cơ bản
Anh ơi, em bị vướn chỗ R đó anh, nó không tìm thấy R trong hàm
Rất mong anh chia sẻ cách xử lý. EM cảm ơn anh.
nghe như trong kiếm hiệp ý