2010-10-08 40 views
6

tôi sử dụng mã này trong getView tôi:hình ảnh sai hiển thị trong hàng ListView của tôi

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 

     LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.listrow, null); 
    } 
    Order o = items.get(position); 

    if (o != null) { 
     TextView tt = (TextView) v.findViewById(R.id.toptext); 
     ImageView thumb = (ImageView) v.findViewById(R.id.icon); 

     if (o.getOrderDrawable() != null) { 
      thumb.setImageDrawable(o.getOrderDrawable()); 
     } else { 
      tt.setText(o.getOrderTitle()); 
     } 

    } 
    return v; 
} 

Vấn đề là khi di chuyển; đôi khi hình ảnh chính xác hiển thị, nhưng đôi khi khi cuộn lại/chuyển tiếp, hình ảnh hiển thị ngẫu nhiên và hình ảnh không được liên kết với hàng.

Hình ảnh được tải xuống từ web.

Tôi nên giải quyết vấn đề này như thế nào?

Trả lời

24

Android ListView sử dụng lại các mục danh sách khi chúng không còn cần nữa. Vì lý do này, bạn cần đảm bảo rằng tất cả các chế độ xem sẽ thay đổi, thực sự sẽ thay đổi.

Vấn đề của bạn là nếu bạn không tìm thấy đối tượng có thể rút cho mục danh sách hiện tại, bạn không được làm trống hoặc ẩn số ImageView. Bạn nên làm thumb.setImageDrawable(null) trong trường hợp đó hoặc thumb.setVisibility(View.GONE).

+0

Cảm ơn bạn, đã giải quyết nó! Vấn đề là một số hình ảnh của tôi đã biến mất trên máy chủ web. Cảm ơn vì điều này. – Curtain

+0

khi tôi muốn hiển thị hình ảnh trình giữ chỗ trong khi hình ảnh được chụp từ internet. Tôi sẽ làm như thế nào? Và hoạt động nào là vi.inflate đắt nhất (R.layout.listrow, null)? – Karussell

+0

Cảm ơn trước – Mojiiz

-1

Nếu bạn ngừng sử dụng convertView mà bạn nhận được (điều bạn hoàn toàn cần) và tạo một Chế độ xem hoàn toàn mới để trả về mọi lúc, nó có hoạt động đúng không? Tôi nghĩ rằng vấn đề là trong cách bạn sử dụng lại các quan điểm.

+1

không dừng lại tái sử dụng quan điểm. Bạn phải sử dụng lại các chế độ xem chính xác nhưng chắc chắn bạn nên sử dụng lại chúng. – Janusz

+0

Những gì Janusz nói. Hãy thử xây dựng một danh sách với một vài chục mục, và lướt qua nó (hoặc tệ hơn, nhanh chóng di chuyển qua nó). Nếu không sử dụng lại lượt xem, hiệu suất sẽ rất khủng khiếp. – benvd

-1

Tôi đã thử sử dụng giải pháp được đánh dấu ở đây là chính xác nhưng không giải quyết được vấn đề hình ảnh sai trong khi cuộn. Tôi đã thử thứ hai (Zsombor Erdődy-Nagy) và bây giờ nó thực sự ổn. Vì vậy, nhờ Zsombor :-)

Dưới đây là đoạn mã của tôi:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    /* 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.tweet_list, null); 
    } 
    */ 
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View v = vi.inflate(R.layout.tweet_list, null); 
    final Status status = getItem(position); 
    if (status != null) { 
     TextView statusName = (TextView) v.findViewById(R.id.statusName); 
     TextView statusText = (TextView) v.findViewById(R.id.statusText); 
     TextView statusWhen = (TextView) v.findViewById(R.id.statusWhen); 
     TextView statusScreenName = (TextView) v.findViewById(R.id.statusScreenName); 
     final ImageView statusUserImage = (ImageView) v.findViewById(R.id.statusUserImage); 
     statusName.setText(status.getUser().getName()); 
     statusScreenName.setText("@" + status.getUser().getScreenName()); 
     statusText.setText(status.getText()); 
     statusWhen.setText(dateTimeFormatter.format(status.getCreatedAt())); 
     URL url = status.getUser().getProfileImageURL(); 
     String imageCacheKey = url.getPath(); 
     Drawable cachedImage = imageCache.get(imageCacheKey); 
     if (null != cachedImage) { 
      statusUserImage.setImageDrawable(cachedImage); 
     } else { 
      new DownloadImageTask(statusUserImage, imageCacheKey).execute(url); 
     } 

    } 
    return v; 
} 
+0

Xin chào Alex, tôi đã có cùng trải nghiệm với bạn nhưng sau đó tôi nhận ra rằng tôi cần setVisibility (View.GONE) cho mỗi chế độ xem (tất cả TextView và ImageView). Khi tôi đã làm điều đó, tôi đã có thể sử dụng lại phần mềm convertView. Tôi nghĩ rằng nó là tốt hơn, có lẽ hiệu quả hơn để tái sử dụng khi có thể. – wuliwong

+0

Điều này chắc chắn không phải là cách để đi. Mỗi khi một mục danh sách mới cần được hiển thị, bạn đang tạo nó hoàn toàn từ đầu. Bố trí inflayout là một hoạt động rất tốn kém. Bạn nên sử dụng lại convertView. Tôi chắc chắn nó hoạt động, không hiệu quả. Nếu bạn tái sử dụng convertView và bạn vẫn có hình ảnh sai hiển thị, đó là vì bạn không thiết lập chính xác tất cả các chế độ xem trong mục danh sách của mình. – benvd

Các vấn đề liên quan