Đây là một trường hợp rất phổ biến: hiển thị hình ảnh trong một ListView mà phải được tải xuống từ internet.Android - Vấn đề với hình ảnh tải chậm vào một ListView
Ngay bây giờ tôi có một lớp con tùy chỉnh của ArrayAdapter mà tôi sử dụng cho ListView. Trong getView() của tôi thực hiện của ArrayAdapter, tôi sinh ra một luồng riêng biệt để tải một hình ảnh. Sau khi tải xong, nó tìm kiếm ImageView thích hợp và đặt hình ảnh bằng ImageView.setImageDrawable(). Vì vậy, các giải pháp tôi sử dụng là loại tương tự như thế này: Lazy load of images in ListView
Vấn đề tôi gặp phải là ngay sau khi tôi thực hiện cuộc gọi đến setImageDrawable() trên ImageView, ListView bằng cách nào đó làm mới tất cả các hàng hiện có thể nhìn thấy trong danh sách! Điều này dẫn đến loại một vòng lặp vô hạn:
- getView() được gọi
- thread được sinh ra để tải hình ảnh
- hình ảnh được tải; setImageDrawable() được gọi trên ImageView
- ListView chọn nó vì lý do nào đó và tự làm mới chính nó
- Để ListView làm mới, getView() được gọi cho mỗi hàng nhìn thấy được, vì vậy chúng ta quay lại bước 1 và toàn bộ lặp lại chính nó
Vì vậy, theo như tôi có thể thấy, giải pháp được đề xuất trong "Android - Làm cách nào để tải ảnh chậm trong ListView" (xem liên kết ở trên) không hoạt động. Nó có thể trông giống như nó, nhưng nó sẽ chạy rất chậm vì trong nền, nó tiếp tục tải lại các hàng hiện đang nhìn thấy.
Có ai gặp phải điều này trước và/hoặc có giải pháp cho việc này không?
Có Tôi đang sử dụng bản đồ để lưu hình ảnh. Nhưng điều đó không quan trọng, vì tôi cuối cùng vẫn gọi setImageDrawable() mà một lần nữa kích hoạt làm mới. Nếu tôi bằng cách nào đó có thể vô hiệu hóa refesh nó sẽ giải quyết vấn đề của tôi. Tôi không sử dụng SoftReferences (nhưng tôi sẽ), nhưng đó chỉ là tối ưu hóa bộ nhớ, điều này không giải quyết được vòng lặp vô hạn –
điểm tốt Tôi hiểu lầm những gì bạn có nghĩa là 'thread được sinh ra để * tải * hình ảnh' . Tôi sẽ viết lại câu trả lời của tôi – Will
Cảm ơn bạn đã trả lời nhanh chóng :) Những gì bạn đang mô tả hiện không giải quyết được vấn đề khi bạn không sử dụng lại chế độ xem để hiển thị các hàng như tôi. Với việc sử dụng lại các hàng, tôi có nghĩa là sử dụng đối số "convertView" được trao cho getView(). Bạn có biết giải pháp cho điều này khi sử dụng lại chế độ xem hàng không? (bởi vì trong trường hợp đó, bạn phải gọi setImageDrawable() mỗi lần) –