2014-09-24 59 views
0

我在ListView中加載圖像,並使用convertView添加新項目。我發現,當我快速向下滾動時,幾個屏幕上的圖像顯示在當前的圖像之前..在getView中,我正在實例化一個AsyncTask。我該如何解決?會使圖像緩存工作,還是我必須找到一種方法來與已啓動的AsyncTasks進行通信,並告訴它們停止加載不會顯示的圖像?ListView圖像和使用convertView

下面是相關代碼:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.list_item_course, null); 
    } 
    CourseItem courseItem = courseItemList.get(position); 

    // ImageView 
    Bitmap bm = courseItem.getPhotoBitmap(); 

    ImageView iv = (ImageView) convertView.findViewById(R.id.imageView1);  
    iv.setAdjustViewBounds(true); 
    iv.setMaxHeight(imageWidth); 
    iv.setMaxWidth(imageWidth);  

    if (bm != null) { 
     iv.setImageBitmap(bm); 
    } else { 
     CourseItemAndView container = new CourseItemAndView(); 
     container.courseItem = courseItem; 
     container.view = convertView; 

     ImageLoader loader = new ImageLoader(); 
     loader.execute(container);     
    } 

... 

return convertView; 
} 

private class CourseItemAndView { 
    public CourseItem courseItem; 
    public Bitmap bitmap; 
    public View view; 
} 

private class ImageLoader extends AsyncTask<CourseItemAndView, Void, CourseItemAndView> { 

    @Override 
    protected CourseItemAndView doInBackground(CourseItemAndView... params) { 

     CourseItemAndView container = params[0]; 
     CourseItem ci = container.courseItem; 

     try { 
      String imageUrl = ci.getSmallIcon(); 
      InputStream in = (InputStream) new URL(imageUrl).getContent(); 
      Bitmap bitmap = BitmapFactory.decodeStream(in); 
      if (bitmap == null) 
       System.out.println("HERE"); 
      ci.setPhotoBitmap(bitmap); 
      in.close(); 
      container.bitmap = bitmap; 
      return container; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(CourseItemAndView result) { 
     if (result == null) { 
      System.out.println("HERE"); 
     } else { 
      ImageView iv = (ImageView) result.view.findViewById(R.id.imageView1); 
      iv.setImageBitmap(result.bitmap); 
     } 
    } 

} 
+0

不僅要他們停止時,ImageView的是淡出人們的視線,而且他們應該只加載其位圖中右邊的ImageView。你沒有顯示任何處理它的代碼。你也沒有告訴。請發佈完整的getView代碼。 – greenapps 2014-09-24 16:34:52

+0

如果convertView不爲空,我重用該視圖,所以當我滾動說2屏幕時,兩個不同的位圖被加載到相同的convertView的ImageView子。除了「return convertView」之外,getView中沒有其他有用的代碼...我會嘗試發佈其他相關代碼。 – 2014-09-24 17:27:22

回答

0

爲了使異步任務知道爲ListView,因此它可以當它希望把位圖中添加的位置和列表視圖參數採取相應的行動項目位置到asynctask。並用asynctask實例標記imageview。

ImageLoader loader = new ImageLoader(listView, position); 
    container.view.setTag(loader); 
    loader.execute(container);  

然後在onPostExecute位置不是必須放置位置是可見的項目列表視圖之外。

if(position < listView.getFirstVisiblePosition() 
    || position > listView.getLastVisiblePosition() 
    ) 
     return; 

然後檢查任務是否屬於與圖像視圖:

if (imageView.getTag() != this) 
    return; 

.... place bitmap ..