2012-09-21 21 views
5

Đâ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 onMeasureonLayout đ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.

+0

chia sẻ suy nghĩ cách bạn khắc phục sự cố? – Dbl

Trả lời

2

Đã lâu rồi nhưng tôi gặp vấn đề tương tự gần đây, một hàng trong chiều cao danh sách của tôi đã thay đổi quá nhiều, gây ra listview.onmeasure được gọi.

Nếu bạn đang xây dựng dựa trên API-14 trở lên, bạn có thể đặt điểm ngắt trong mã nguồn SDK. điều đó sẽ giúp tìm ra lý do tại sao chiều cao được thay đổi.