[Android Cơ Bản] ListView – ViewHolder trong Android

Lời nói đầu : Xin chào các em, hôm nay thầy viết 1 bài hướng dẫn cơ bản về ListView trong Android. Tuy nhiên, chúng ta sẽ sử dụng kèm với 1 khái niệm là ViewHolder để tối ưu ListView.
Bài demo chi tiết sẽ được livestream trên Fanpage của Thầy tại :
https://www.facebook.com/HuyNguyenAndroid
21h – 27/04/2019
Phát lại trên kênh Youtube : https://www.youtube.com/channel/UCrX5WbVYOs2IheACdjRsxpA
Các em nhớ đón xem nhé . 🙂

  • ListView

ListView trong Android sử dụng để hiển thị 1 danh sách dữ liệu theo chiều dọc và có thể cuộn được khi dữ liệu dài quá màn hình.

Để tùy biến giao diện cho các hàng – row trong ListView chúng ta cần sử dụng 1 lớp là BaseAdapter được viết như sau, lưu ý trong bài này Thầy sẽ demo 1 danh sách sinh viên vì vậy chúng ta tạo class mới StudentAdapter kế thừa BaseAdapter và override các phương thức sau :

Chọn New Class Java và nhập như hình
Click chuột trái vào StudentAdapter nhấn Alt+Enter lựa chọn Implement Methods

Thầy giải thích sơ bộ ý nghĩa các phương thức như sau :

getCount : phương thức có kiểu giá trị trả về là Int, số lượng hàng – row mà ListView hiển thị

getItem : phương thức trả về 1 đối tượng – Object là hàng – row trong ListView vị trí của hàng là tham số int position

getItemId : phương thức định nghĩa id cho 1 hàng – row. Tuy nhiên do ListView đã có số thứ tự dạng index 0,1,2,3… nên phương thức này thường không dùng, chúng ta giữ nguyên

getView : phương thức định nghĩa giao diện cho 1 hàng – row

Lưu ý : thông thường sẽ truyền 2 tham số vào trong class StudentAdapter là : List<Student>Context
Chúng ta bổ sung các phương thức như sau :

Line 18 : Phương thức khởi tạo hay hàm tạo, truyền vào 2 tham số Context và List<Student>

Line 24 : trả về số hàng trong ListView = độ dài của mảng students.size()

Line 29 : trả về đối tượng Student được hiển thị trên hàng – row của ListView theo vị trí (int position)

Line 40 : Khởi tạo giao diện cho hàng – row với câu lệnh LayoutInflater từ file row.xml, tham chiếu các đối tượng giao diện TextView từ file và truyền dữ liệu

Sau khi bổ sung phần thân các phương thức trong StudentAdapter, chúng ta viết code phía MainActivity, chạy thử chúng ta được kết quả :

Line 39 : set dữ liệu hiển thị cho ListView

Kết quả :

Tuy nhiên, nếu để ý các em sẽ thấy, mỗi lần hiển thị 1 row, chương trình sẽ chạy vào phương thức getView 1 lần và khai báo lại các thành phần giao diện.

Nếu ở 1 row với giao diện đơn giản, thì chương trình sẽ chạy bình thường. Nhưng nếu giao diện phức tạp với nhiều thành phần thì chương trình sẽ bị giật, lag do phải vẽ và khai báo nhiều đối tượng.

Để có thể giảm thiểu và tối ưu trong bài này Thầy giới thiệu tới các em 1 đối tượng là ViewHolder để giảm thiểu việc khai báo lặp lại trong phương thức getView. Mn cùng xem ảnh dưới để thấy sự thay đổi

Cách làm như sau :

Bước 1 : Tạo mới 1 class tên là ViewHolder và khai báo các thành phần giao diện có trên row

Bước 2 : sử dụng câu lệnh setTag và getTag như ở dòng 54 và 56 để kiểm tra rằng View trong row chỉ cần khởi tạo 1 lần duy nhất, những lần sau nếu đã khởi tạo rồi thì sẽ lấy từ getTag thay vì khởi tạo mới.

Điều này sẽ giúp giảm thiểu số lần khởi tạo các thành phần giao diện từ đó giảm tài nguyên sử dụng và ứng dụng sẽ hiển thị mượt hơn.

Mọi thắc mắc các em comment tại bài viết này hoặc video hướng dẫn trên fanpage hoặc kênh youtube nhé.

Đừng quên like, follow fanpage để nhận thêm nhiều bài viết nữa nhé.

Bài demo chi tiết sẽ được livestream trên Fanpage của Thầy tại :
https://www.facebook.com/HuyNguyenAndroid
21h – 27/04/2019
Phát lại trên kênh Youtube : https://www.youtube.com/channel/UCrX5WbVYOs2IheACdjRsxpA
Các em nhớ đón xem nhé . 🙂