01/10/2018, 10:30

Hỏi về getTag() và setTag() trong viewHolder > listview trong lập trình android

Em có đoạn code như sau ạ


Khi em chạy thử để kiểm tra tag thì kết quả hiện ra như sau ạ:
Ban đầu như thế này ạ:

Sau khi em kéo listview ạ:

ListView hiển thị được 5 row, tại sao ở phần tử thứ 6 nó lại xuất hiện là “set” chứ không phải là “get”, tại sao lại như vậy ạ? Và getTag() và setTag() dùng để làm gì vậy ạ, em cám ơn ạ

Quốc Công viết 12:45 ngày 01/10/2018

Hy vọng sẽ giúp ít được cho bạn

  • ViewHolder dùng để lưu giữ lại các thành phần của 1 view, ví dụ 1 view có các thành phần như textview, button…
  • Mục đích của việc lưu giữ này là để thay đổi nội dung hiển thị của view mà tránh phải khởi tạo lại các thành phần. Bạn để ý trong hàm getView sẽ thấy như thế này nhé:
  • Nếu như convertview == null thì khi đó sẽ phải tạo mới view (inflate file layout), đồng thời tạo mới viewholder. Sau đó sẽ setTag cho cái convertview này là cái holder vừa tạo mới (setTag)
  • Nếu convertview != null thì chỉ việc lấy tag đó ra (getTag) mà ko cần phải findViewById nữa
    Sau khi có cái viewholder rồi (tạo mới hoặc get) lúc đó ta sẽ set nội dung hiển thị cũng như sự kiện cho các thành phần đó
    Hay nói một cách gần chính xác hơn đây chính là caching view
du viết 12:42 ngày 01/10/2018

Vì khi bạn debug kỹ sẽ thấy khi item 6 bắt đầu xuất hiện trong view thì item 1 chưa hoàn toàn mất khỏi view nên nó ko được recycle cho item 6. Nghĩa là 6 item đầu tiên được khai báo 6 địa chỉ mới, đến item 7 mới dùng lại vùng bộ nhớ của item 1.

beginner viết 12:39 ngày 01/10/2018

em cám ơn ạ

Bài liên quan
0