GridView中的进度对话框

时间:2012-01-28 07:29:22

标签: android gridview progressdialog

我的代码如下:

public class wall extends Activity {
GridView webgridview;
Button web;

ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.wall);

pd = ProgressDialog.show(wall.this,"Loading", "Please Wait...",true);
                new Thread() {
                    public void run() {
                    try {
webgridview.setAdapter(new WebImageAdapter(wall.this));
}catch(Exception e)
{
}
handler.sendEmptyMessage(0);
pd.dismiss();
}
}.start();
private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        Toast.makeText(wall.this, "finished", 1).show();
    }
};

我的适配器类如下。我只在上面的类中编写进度对话框。

public class WebImageAdapter extends BaseAdapter {
private Context mContext;
public static String[] myRemoteImages = {
    "http://www.evergreenhits.com/ad/wallpapers/3d_1.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_2.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_3.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_4.jpg",
    "http://www.evergreenhits.com/ad/wallpapers/3d_5.jpg"
        };

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

public int getCount() {
    //return animals.length;
     return this.myRemoteImages.length;

}

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

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

// create a new ImageView for each item referenced by the Adapter
public ImageView getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    imageView = new ImageView(mContext);
    if (convertView == null) {

        imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

        imageView.setPadding(8, 8, 8, 8);
  } else {
        imageView = (ImageView) convertView;
    }

try { 
URL aURL = new URL(myRemoteImages[position]); 
URLConnection conn = aURL.openConnection(); 
conn.connect(); 
InputStream is = conn.getInputStream(); 
BufferedInputStream bis = new BufferedInputStream(is); 
Drawable d=Drawable.createFromStream(bis, "src Name");

bis.close(); 
is.close(); 
imageView.setImageDrawable(d); 
} catch (IOException e) { 
Log.e("DEBUGTAG", "Remote Image Exception", e); 
} 

imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
imageView.setLayoutParams(new GridView.LayoutParams(150, 150)); 
    return imageView;
}

进度对话框无法正常工作。它在gridview中加载的图像之前显示并突然消失。请尽快帮助我。

2 个答案:

答案 0 :(得分:3)

使用AsyncTask:

致电:

dialog=ProgressDialog.show(wall.this,"Loading", "Please Wait...",true);
        doback dob=new doback();
        dob.execute();

class doback extends AsyncTask<URL, Integer, Long>
    {

        @Override
        protected Long doInBackground(URL... arg0) 
        {
            try
            {
                        //getImagepaths from Server
            }
            catch(Exception e)
            {

            }
            return null;
        }
        protected void onProgressUpdate(Integer... progress) 
        {

        }
        protected void onPostExecute(Long result) 
        {
            try
            {
                webgridview.setAdapter(new WebImageAdapter(wall.this));

                dialog.dismiss();
            }
            catch(Exception e)
            {
                e.printStackTrace();
                dialog.dismiss();
            }
        }
    }

适配器代码是这样的:

class WebImageAdapter extends BaseAdapter{

//      @Override
        public int getCount() {

        return names.length;
        }

//      @Override
        public Object getItem(int position) {

        return null;
        }

//      @Override
        public long getItemId(int position) {

        return 0;
        }

//      @Override
        public View getView(int pos, View convertView, ViewGroup parent) {
        View row=getLayoutInflater().inflate(R.layout.nameitem,null);
        ImageView image=(ImageView)row.findViewById(R.id.image);

        image.setImageBitmap(convertImage(myRemoteImages[position]))// convertImage is to convert url to bitmap
        return row;
        }

        }

编辑 - 来自Android Developer Documentation:ProgressDialog

  

此类已在API级别26中弃用。

     

ProgressDialog 是一种模式   对话框,阻止用户与应用程序交互。代替   使用这个类,你应该使用像这样的进度指示器   ProgressBar,可以嵌入到您应用的用户界面中。或者,   您可以使用notification通知用户任务的进度。

答案 1 :(得分:-2)

setAdapter(),不需要花费更多时间,每次上网时都会使用适配器类的getView()并花费时间。因此在setAdapter上使用progressDialog是不合适的。在滚动网格时,使用代码需要花费大量时间,因为getView()会在滚动视图上自动调用。

你应该从LazyList获得一个引用,用于从网上加载图像并将它们放在ImageView中。