2012-10-10 10 views
5

Mam adapter z tym getView:getView nazywa się kilka razy na pierwszej pozycji w GridView

public View getView(int position, View convertView, ViewGroup parent) { 
    Log.d("getView gv", position+""); 

    NewsLine holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.grid_entry, parent, false); 
     holder = new NewsLine(); 

     holder.iv= (ImageView) convertView.findViewById(R.id.photo); 

     convertView.setTag(holder); 
    } else { 
     holder = (NewsLine) convertView.getTag(); 
    } 

    NewsItem item=news.ITEMS.get(position); 
    //--------- 

    if(item.imgurl!=null && item.imgurl.compareToIgnoreCase("null")!=0) 
    { 
     holder.iv.setVisibility(View.VISIBLE);  
     mMemoryCache.loadBitmap(item.imgurl, holder.iv,position); 
    } 
    else 
     holder.iv.setVisibility(View.INVISIBLE); 
    //------------- 




    return convertView; 
} 

mam dwa problemy:

  1. getView nazywa się kilka razy na pozycji 0 (bitmapa jest pobierana za pomocą AsyncTask, jeśli została pominięta w LruCache). Mam animację (alfa od 0-1), która uruchamia się kilka razy dla tej pozycji.

  2. ponieważ przetwarzam widok, czasami można zobaczyć starą zawartość obrazuView przez ułamek sekundy.

// ----

I tu jest klasa cache (tylko kupa):

public class SetImgAT extends LruCache<String, Bitmap> { 
private static SetImgAT instance; 
private Animation FadeInAnimation; 

private SetImgAT(int size, Context context) { 
    super(size); 
    FadeInAnimation = AnimationUtils.loadAnimation(context, R.anim.fadein); 
} 

public static synchronized SetImgAT getInstance(int size, Context context) { 
    if (instance == null) { 
     instance = new SetImgAT(size, context); 
    } 
    return instance; 
} 

@Override 
protected int sizeOf(String key, Bitmap value) { 
    return (value.getRowBytes() * value.getHeight()); 
} 

public void loadBitmap(String url, ImageView imageView,int pos) { 
    Bitmap bitmap = instance.get(url.hashCode() + ""); 
    if (bitmap != null) { 
     Log.d("ImageCache", "hit - "+url.hashCode()+"pos:"+pos); 
     imageView.setImageBitmap(bitmap); 

     imageView.invalidate(); 
    } else { 
     Log.d("ImageCache", "miss"); 
     BitmapWorkerTask task = new BitmapWorkerTask(imageView); 
     task.execute(url); 
    } 
} 

class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> { 
    ImageView mImageView; 

    public BitmapWorkerTask(ImageView imageView) { 
     mImageView = imageView; 
    } 

    @Override 
    protected Bitmap doInBackground(String... url) { 
     Bitmap Picture = null; 


     if (url[0] != null && url[0].compareToIgnoreCase("null") != 0) { 
      Log.d("GetBMP from", url[0]); 

      URL img_value = null; 
      try { 
       img_value = new URL(url[0]); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      try { 
       Picture = BitmapFactory.decodeStream(img_value 
         .openConnection().getInputStream()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      if (Picture == null) { 
       Log.d("deb", "no bitmap"); 
      } else { 
       Log.d("got deb", "got bitmap to "+url[0].hashCode());     
       instance.put(url[0].hashCode()+"", Picture); 
      } 

     } 
     return Picture; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     // super.onPostExecute(result); 
     if (result != null) { 
      Log.d("deb", "set bitmap"); 
      mImageView.setImageBitmap(result); 
      //mImageView.startAnimation(FadeInAnimation); 
     } 

    } 
} 

// ------------- ---

}

Dziękujemy! :)

+0

Do pytania nr 2, spróbuj wywołaniem 'mMemoryCache.loadBitmap()' 'setVisibility przed()' aby zapobiec stary obraz z pojawiania się. – Sam

+2

"getView jest wywoływany kilka razy dla pozycji 0" - Jest to całkowicie normalne zachowanie. Nie ma reguł określających, ile razy 'getView()' będzie wywoływane dla pozycji. Ogólnie rzecz biorąc, StackOverflow służy do programowania pytań, a Ty nie zadałeś pytania. – CommonsWare

+0

Sam to nie zadziałało, wydaje się, że jest o wiele więcej do załatwienia, przechodzę przez próbkę do buforowania bitmap z http://developer.android.com/training/displaying-bitmaps/cache-bitmap. html. na CommonsWare, dziękuję, nie sądzę, że muszę przeformułować to jako pytanie, może możesz spróbować. – Misca

Odpowiedz

0

Widziałem podobne zachowanie podczas przewijania w przód iw tył lub przypadkowo wywołanie notifyDataSetChanged().

Jako ulepszenie tego, co teraz robimy, sugerowałbym użycie Picassa zamiast tego, ponieważ radzi sobie z tym przypadkiem bardzo dobrze, oprócz zaniku animacji.

Jeden liner w getView():

Picasso.with(context).load(urlToLoad).into(imageView); 

Patrz: http://square.github.io/picasso/

Powiązane problemy