2014-03-29 3 views
8

Ich versuche, Bilder aus dem Internet mithilfe von Universal Image Loader auf einer Gridview mit dem folgenden Code zu laden.Wiederholung des Bilds beim Scrollen in der Android-Rasteransicht mit Universal Image Loader

public View getView(int position, View converView, ViewGroup parent) { 
     Log.v("Description", "Description is " + position); 
     ViewHolder mVHolder; 
     if (converView == null) { 
      LayoutInflater vi = (LayoutInflater) conted.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      converView = vi.inflate(R.layout.customgrid, null); 
      mVHolder = new ViewHolder(); 
      mVHolder.mImageView = (ImageView) converView 
        .findViewById(R.id.imgview); 
      mVHolder.mTextView1 = (TextView) converView 
        .findViewById(R.id.textView1); 
      mVHolder.mTextView2 = (TextView) converView 
        .findViewById(R.id.textView2); 
      mVHolder.mTextView3 = (TextView) converView 
        .findViewById(R.id.textView3); 

      converView.setTag(mVHolder); 
     } else { 
      mVHolder = (ViewHolder) converView.getTag(); 
     } 
     // mVHolder.mImageView.setImageResource(mThumbIds[position]); 
     // mVHolder.mImageView.setImageDrawable(LoadImageFromURL(
     // mThumbIds[position])); 
     imageLoader.displayImage(mThumbIds[position],mVHolder.mImageView,options, animationListener); 
     Log.v("Names",NAMES[position] + STATES[position] + CONSTITUENCY[position]); 
     mVHolder.mTextView1.setText(NAMES[position]); 
     mVHolder.mTextView2.setText(STATES[position]); 
     mVHolder.mTextView3.setText(CONSTITUENCY[position]); 
     return converView; 
    } 

Allerdings, wenn ich in der Liste nach unten scrollen, das erste Bild der ersten Reihe scheint in den meisten der Netze zu wiederholen. Es bleibt nicht die ganze Zeit - es ändert sich nach einer Weile wieder zum Originalbild. Meine Frage ist, ist dies ein Problem mit View Inflation auf Gridview oder Image Loading von Universal Image Loader?

+0

Was ist hier Imageloader? – km86

+0

@ user3431672, Bild-Loader ist Universal Image Loader https://github.com/nostra13/Android-Universal-Image-Loader – Saty

+0

Es sieht aus wie es mit dem Adapter zu tun hat. Versuchen Sie einfach, das Recycling der Ansicht zu entfernen und zu überprüfen, ob die Bilder richtig angezeigt werden. Es wäre langsam und das Scrollen wäre lückig. Aber es sollte eine Vorstellung davon geben, wo wir ein Problem haben. Wir sollten dann gut debuggen. – km86

Antwort

16

Ich denke, Ihr Problem ist, dass Sie nicht die resetViewBeforeLoading() Methode für DisplayImageOptions wie folgt setzen: -

 DisplayImageOptions options = new DisplayImageOptions.Builder() 
    .showStubImage(R.drawable.stub_image) 
    .showImageForEmptyUri(R.drawable.image_for_empty_url) 
----> .resetViewBeforeLoading(true)<----very important for recycling views 
    .cacheInMemory() 
    .cacheOnDisc() 
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 
    .bitmapConfig(Bitmap.Config.ARGB_8888) // default 
    .delayBeforeLoading(1000) 
    .displayer(new SimpleBitmapDisplayer()) // default 
    .build(); 

und dann diese DisplayImageOptions gelten.

 imageLoader.displayImage(mThumbIds[position],mVHolder.mImageView,options,     animationListener); 
+1

Das ist nicht genau der Fall, aber es ist verwandt, ich hatte die showStubImage (R.drawable.stub_image) entfernt, um den Effekt zu sehen und vergaß ... jetzt hinzugefügt und es nicht das Bild zu wiederholen danke. – Saty

+0

Ihr willkommener Bruder ..! –

+1

Das hat es für mich gelöst! Vielen Dank! – David

1

Eine andere Lösung ist setTag() zu verwenden, für Ansicht identifizieren:

class ViewHolder { 
    ImageView thumbnail; 
    public boolean isSameView(String tag) { 
     if (tag == null) { 
      return thumbnail.getTag() == null; 
     } 
     return tag.equals(thumbnail.getTag()); 
    } 
} 


protected void imageLoader(ViewHolder holder, String imageUrl) { 
    if (!holder.isSameView(imageUrl)) { // If image is loaded correctly skip else reload and set new image 
     holder.thumbnail.setTag(imageUrl); 
     imageLoader.displayImage(imageUrl, holder.thumbnail, new SimpleImageLoadingListener() {@ 
      Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
       view.setTag(failReason.getType().name()); // You can handle errors and avoid repeating requests that return error codes 
      } 
     }); 
    } 
}