Đây là thiết lập của tôi. Tôi có một tùy chỉnh ListView
với một số tiêu đề ưa thích, nằm bên trong một ViewPager
. Tôi đang duy trì bộ nhớ cache của hình ảnh đã được tải xuống và lưu trữ cục bộ như bất kỳ nhà phát triển tự tôn trọng nào.Tránh onMeasure và onLayout everytime ImageView Bitmap được thiết lập
Vấn đề tôi đang gặp là mỗi lần tôi gọi setImageBitmap(Bitmap bm)
trên ImageView
trong getView()
phương pháp ListView
's của tôi, sử dụng một Bitmap từ bộ nhớ cache, nó gây ra tất cả xem tôi để onMeasure()
. Tôi đã nhìn qua mã nguồn Android ImageView
và thấy điều này:
public void setImageDrawable(Drawable drawable) {
if (mDrawable != drawable) {
mResource = 0;
mUri = null;
int oldWidth = mDrawableWidth;
int oldHeight = mDrawableHeight;
updateDrawable(drawable);
if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
}
Vì vậy, tôi có thể thấy rằng setImageDrawable
(được gọi bằng setImageBitmap
) yêu cầu bố trí của nó bất cứ khi nào drawable
đã kích thước khác nhau hơn so với trước Drawable
của nó. Vấn đề là ImageView
của tôi được đặt tĩnh thành 60dp x 60dp, vì vậy kích thước của nó sẽ không thay đổi bất kể kích thước hình ảnh của nó.
Có cách nào tôi có thể nhận được xung quanh các bố cục liên tục được làm lại khi tôi cuộn không? Các cuộc gọi onMeasure
và onLayout
đang lan truyền theo cách của họ lên cây View
, vì vậy, và ViewPager
cũng được đo ở giữa cuộn danh sách, điều này rõ ràng là gây ra các vấn đề nghiêm trọng về hiệu suất (~ 100ms UI jumps).
Hiệu suất thật khủng khiếp và tôi cần sửa nó. Bất cứ ai có bất kỳ giải pháp?
Cảm ơn.
chia sẻ suy nghĩ cách bạn khắc phục sự cố? – Dbl