0

私はAndroidが初めてのので、ここで間違っているのは分かりません。私は画像の束を表示しているグリッドビューを持っており、アダプタを使ってグリッドビューを生成しています。グリッドビューは非常に遅く/遅いので、私はasynctaskを使ってイメージビューのイメージソースを設定しようとしました。何らかの理由で、イメージビューがリソースを取得していないため、空白が表示されます。これは私のコードです:Asynctaskが画像ビュー用のimageresourceを設定していません

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やPicassoのようなイメージライブラリを使用することをお勧めします –

答えて

1

ImageViewまたはGridViewが更新されたことを認識していないことがあります。このような場合は、invalidate()を呼び出して修正することができます。

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

     //invalidate call 
     iview.invalidate(); 

    } 
} 

これ以上でもかまいません。それがあなたのために働くかどうか私に教えてください。

+0

答えのためにありがとうMatt。それはうまくいきませんでしたが、代わりにライブラリを使用することに決めました。 –

0

ローカルアセットを別のスレッドに読み込む理由はないと思います。また、UIが更新されたときには、メインスレッド上でUIを実行しなければならないので、マルチスレッドはそれを助けません。他のスレッドは、インターネットからの画像や情報の読み込みなどに使用する必要があります。

0

Glideのようなイメージローダーのライブラリを使用してみてください。私の意見では、Glideはこれまで最高のimageLoaderです。高速で、メモリ管理にも最適なので、メモリ不足の例外が発生することはありません。

関連する問題