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 ạ

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
1 Like

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.

em cám ơn ạ :slight_smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?