RecyclerView và ViewHolder trong Android Studio

Khóa học lập trình Android cơ bản

5.0 (2 đánh giá)
Tạo bởi Kteam Cập nhật lần cuối 5 năm trước 86.534 lượt xem 6 bình luận
Tác giả/Dịch giả: Kteam
Học nhanh

Danh sách bài học

01. Giới thiệu lập trình Android và cài đặt môi trường 02. Các chức năng cơ bản của Android Studio 03. Cài đặt máy ảo Android - Có thể bạn chưa biết 04. Cách debug cơ bản với Android Studio 05. Các thành phần giao diện (UI) cơ bản 06. Intent & Manifest trong Lập trình Android 07. Vòng đời của Activity trong Android 08. Fragment và cơ chế BackStack 09. Material Design và Coding Convention 10. ListView và Custom Adapter 11. RecyclerView và ViewHolder trong Android Studio 12. Giao diện trượt ngang với ViewPager và Tab trong Android cơ bản 13. Animation và Transition trong lập trình Android cơ bản 14. Xử lý bất đồng bộ trong lập trình Android cơ bản 15. JSON và web API trong lập trình Android cơ bản 16. Permission trong Android 17. Xử lý nội dung đa phương tiện 18. Lưu trữ dữ liệu với SharedPreferences 19. Lưu trữ dữ liệu với SQLite 20. Lưu trữ dữ liệu với SQLite (Thực hành) 21. Thực hành SQLite với Sugar ORM 22. Tích hợp mạng xã hội - Tạo app Facebook 23. Tích hợp mạng xã hội - Login với Facebook 24. Tích hợp mạng xã hội vào ứng dụng Android (Google) 25. Tích hợp mạng xã hội vào ứng dụng Android (Google) - Phần 2 26. Google Cloud Messaging và Push Notification trong Android - Phần 1 27. Google Cloud Messaging và Push Notification trong Android - Phần 2

RecyclerView và ViewHolder trong Android Studio

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:

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:

RecyclerView và ViewHolder

Để 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'

RecyclerView và ViewHolder

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:

RecyclerView và ViewHolder

Và thiên hạ thấy được:

Nhưng khoan, cái gì kia?

RecyclerView và ViewHolder

Đú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:

RecyclerView và ViewHolder

Và thế là danh sách cấu thành bằng RecyclerView đã hoàn tất:

RecyclerView và ViewHolder


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 likeshare để ủ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

Đánh giá

5.0
2 đánh giá
Đánh giá
5
2
4
3
2
1
JohnWick đã đánh giá 4 năm trước

hoangnhutsp đã đánh giá 6 năm trước

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
thaitoan2210 đã bình luận 6 năm trước

Anh ơi, em bị vướn chỗ R đó anh, nó không tìm thấy R trong  hàm 

public RecyclerViewDataAdapter.DataViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
    View itemView;

    if(viewType==2)
        itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.female, viewGroup, false);
    else
        itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.male, viewGroup, false);

    return new DataViewHolder(itemView);
}

Rất mong anh chia sẻ cách xử lý. EM cảm ơn anh.

Tường Vy đã bình luận 7 năm trước

nghe như trong kiếm hiệp ý

beehomiez đã bình luận 8 năm trước
chỗ thêm dòng compile nên để là com.android.support:recyclerview-v7:+ để đúng với mọi phiên bản sdk hay s ấy a, khác phiên bản là báo lỗi k sync dc
Opiz đã bình luận 8 năm trước
Alt + Insert có getter setter mà anh :D
Không có video.