0

Ich bin neu bei Android, also nicht wirklich sicher, was ich hier falsch mache. Ich habe eine Gridview, in der ich eine Reihe von Bildern zeige, und ich verwende einen Adapter, um die Gridview zu füllen. Die Rasteransicht scrollte sehr langsam/lagy, also habe ich versucht, mit asynctask die Bildquelle für die Bildansichten zu setzen. Aus irgendeinem Grund erhalten die Bildansichten nicht die Ressource, daher werden sie nur leer angezeigt. Dies ist mein Code:Asynctask setzt keine Bildquelle für eine Bildansicht

class ImageAdapter extends BaseAdapter { 
    private Context mContext; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return mThumbIds.length; 
    } 

    public Object getItem(int position) { 
     return null; 
    } 

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { 
      // if it's not recycled, initialize some attributes 
      imageView = new ImageView(mContext); 
      WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
      Display display = wm.getDefaultDisplay(); 
      Point size = new Point(); 
      display.getSize(size); 
      int width = size.x; 
      imageView.setLayoutParams(new GridView.LayoutParams(width/2,(width/2)*515/400)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(0, 0, 0, 0); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     //imageView.setImageResource(mThumbIds[position]); 
     ImageSetter task=new ImageSetter(imageView); 
     task.execute(position); 

     return imageView; 
    } 

    // references to our images 
    private Integer[] mThumbIds = { 
      R.drawable.zsmall_artemis,R.drawable.zsmall_ash,R.drawable.zsmall_bane,R.drawable.zsmall_belle,R.drawable.zsmall_caleb,R.drawable.zsmall_falcyn,R.drawable.zsmall_jaden,R.drawable.zsmall_julien,R.drawable.zsmall_kody, 
      R.drawable.zsmall_mack,R.drawable.zsmall_maxis,R.drawable.zsmall_nero,R.drawable.zsmall_nick,R.drawable.zsmall_nykyrian 
    }; 

    class ImageSetter extends AsyncTask<Integer,Void,Integer>{ 
     private final WeakReference<ImageView> imageViewReference; 

     public ImageSetter(ImageView imageview){ 
      imageViewReference=new WeakReference<ImageView>(imageview); 
     } 
     @Override 
     protected Integer doInBackground(Integer... ImagePos){ 
      return mThumbIds[ImagePos[0]]; 
     } 


     protected void onPostExecute(int ImageId){ 
      if(isCancelled()){ 
       ImageId=mThumbIds[0]; 
      } 
      if(imageViewReference != null){ 
       ImageView iview = imageViewReference.get(); 
       if(iview != null){ 
        iview.setImageResource(ImageId); 


       } 
      } 
     } 
    } 
} 

Das Bild Ressource-IDs alle in dem Array gespeichert sind, und ‚Position‘ verwendet wird, um anzuzeigen, welche Array-Element beziehe ich mich auf. Wie behebe ich das?

+0

Muss die Variable ImageView den Wert korrigieren? Hast du das überprüft? –

+0

Ich würde auch empfehlen, eine Bildbibliothek wie UniversalImageLoader oder Picasso –

Antwort

1

Es kann nur sein, dass das ImageView oder das GridView nicht bemerkt, dass es aktualisiert worden ist. Wenn dies der Fall ist, kann dies mit einem Aufruf von invalidate() behoben werden.

if(imageViewReference != null){ 
    ImageView iview = imageViewReference.get(); 
    if(iview != null){ 
     iview.setImageResource(ImageId); 

     //invalidate call 
     iview.invalidate(); 

    } 
} 

Es kann jedoch mehr als das sein. Lassen Sie mich wissen, ob das für Sie funktioniert.

+0

zu verwenden Danke für die Antwort Matt. Es hat nicht funktioniert, aber ich habe mich entschieden, stattdessen eine Bibliothek zu verwenden. –

0

Ich glaube nicht, dass es einen Grund gibt, lokale Assets in einen anderen Thread zu laden. Auch wenn die Benutzeroberfläche aktualisiert wird, muss sie im Hauptthread durchgeführt werden, so dass Multithreading nicht hilft. Andere Threads sollten für Dinge wie das Laden von Bildern und Informationen aus dem Internet verwendet werden.

0

Verwenden Sie die Bibliothek für Image Loader wie Glide. Meiner Meinung nach ist Glide der beste imageLoader aller Zeiten. Es ist schnell und am besten in der Speicherverwaltung, so dass Sie nie eine Ausnahme wegen zu wenig Speicher erhalten.