0

インターネットから画像を読み込んでいるイメージビューがあります。Web から画像を読み込み、非同期タスクを使用してビットマップ画像に変換しています。イメージ ビューに静止イメージを表示し、イメージの読み込み中にイメージ ビューの上にプログレス スピナーを表示したいと考えています。問題は、xml 内にプログレス スピナーがあり、非同期タスク内で使用できず、イメージビュー内でもプログレス スピナーを表示する方法がわからないことです。これを行うにはどうすればよいですか?ここに私の非同期タスククラスがあります:

public class LoadImage extends AsyncTask<Void, Void, Bitmap>{

    Context callingContext = null;

    ImageView view;
    String b = null;
    ListView lv;
    ProgressDialog p;

    public LoadImage(Context c, ImageView view, String b){

        this.view = view;
        this.b = b;
        this.callingContext = c;
    }


    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
    //  p = (ProgressDialog) findViewById(R.id.progressBar1);
        p = ProgressDialog.show(callingContext, "Loading Events", "Retrieving data from server, please wait...", true);
    }



    public Bitmap getBit(String data){

        Bitmap bitmap;
        BitmapFactory.Options bmOptions;
        bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        //from web
        try {
            bitmap=null;
            InputStream is=new URL(data).openStream();
            BitmapFactory.decodeStream(is, null, bmOptions);
            is.close();
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = 20;
            is = new URL(data).openStream();
            bitmap = BitmapFactory.decodeStream(is, null, o2);
            is.close();
            return bitmap;
        } catch (Exception ex){
           ex.printStackTrace();
           return null;
        }

    }


    @Override
    protected Bitmap doInBackground(String... arg0) {
        // TODO Auto-generated method stub  
        Bitmap b = null;    
        URL imageUrl = null;

        b = getBit(this.b);

            return b;  
    }



    @Override
    protected void onPostExecute(Bitmap result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        if(result == null)
            view.setImageResource(R.drawable.ic_launcher);

        p.dismiss();

    }   
} 
4

1 に答える 1

4

ImageViewとProgessBarを相対レイアウトにラップできます。したがって、画像の読み込み時に、プログレスバーの可視性をVISIBLEに設定し、ImageViewの可視性をGONEに設定します。ビットマップの準備ができたら、可視性を反転します。

public class LoaderImageView extends RelativeLayout {
    private Context     context;
    private ProgressBar progressBar;
    private ImageView   imageView;

    public LoaderImageView(final Context context, final AttributeSet attrSet) {
    super(context, attrSet);
    instantiate(context, attrSet);
    }

   private void instantiate(final Context _context, AttributeSet attrSet) {
       context = _context;
       imageView = new ImageView(context, attrSet);
       progressBar = new ProgressBar(context, attrSet);
       progressBar.setIndeterminate(true);

       addView(progressBar);
       addView(imageView);

       this.setGravity(Gravity.CENTER);
   }

   // ...

   // Then, play with this method to show or hide your progressBar
   public LoaderImageView(final Context context, final AttributeSet attrSet) {
    super(context, attrSet);
    instantiate(context, attrSet);
   }

}
于 2012-07-24T15:48:30.890 に答える