GridView中的进度对话框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GridView中的进度对话框相关的知识,希望对你有一定的参考价值。

我的代码如下:

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

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

答案

使用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这样的进度指示器,而不是使用这个类,它可以嵌入到您应用的UI中。或者,您可以使用notification通知用户任务的进度。

另一答案

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

你应该有LazyList的参考资料从web加载图像并将它们放在ImageView中。

以上是关于GridView中的进度对话框的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android中加载带有动画的cardview GridView?

如何从片段中检索gridview中的图像?

Honeycomb 中的片段加载微调器/对话框

如何在家庭活动android上显示进度对话框?

片段中gridview的Android文本和图像适配器

片段中的网格视图