2016-07-12 147 views
0

我是Android新手,所以不確定我在這裏做錯了什麼。我有一個gridview,我正在顯示一堆圖片,我正在使用一個適配器來填充gridview。 gridview滾動非常緩慢/遲緩,所以我嘗試使用asynctask來設置imageviews的圖像資源。出於某種原因,圖像視圖沒有獲取資源,所以它們只是顯示空白。這是我的代碼:Asynctask沒有設置圖像視圖的圖像資源

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); 


       } 
      } 
     } 
    } 
} 

圖片資源ID都存儲在陣列中,和「位置」是用來表示我指的是哪個數組元素。我該如何解決?

+0

變量ImageView是否需要更正值?你檢查過了嗎? –

+0

此外,我會建議使用像UniversalImageLoader或畢加索圖像庫 –

回答

1

這可能只是因爲ImageView或GridView沒有意識到它已被更新。如果是這種情況,可以使用invalidate()調用來修復它。

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

     //invalidate call 
     iview.invalidate(); 

    } 
} 

雖然它可能不止於此。讓我知道這是否適合你。

+0

感謝您的答案馬特。它沒有工作,但我決定只是使用庫來代替。 –

0

我不認爲有任何理由在另一個線程上加載本地資源。另外當UI更新時,它必須在主線程上完成,所以多線程對此沒有幫助。其他線程應該用於加載來自互聯網的圖像和信息。

0

嘗試使用圖像加載器的庫,如Glide。在我看來,Glide是有史以來最好的圖像加載器。它速度快,在內存管理方面最好,所以你永遠不會遇到內存不足的例外。