如何将进度条添加到gridview

时间:2011-09-24 14:33:32

标签: android multithreading gridview progress-bar android-asynctask

我是android编程的初学者,所以也许这是一个愚蠢的问题...... 我读了很多关于异步任务来添加进度条,但我找不到我需要的解决方案:

我必须显示网格视图,但我需要搜索要在其中显示的图像和文本的数据。 因此,如果我在asynctask中的数组中加载相关数据,则网格的适配器没有数据和崩溃。 否则,如果我将进度对话框放在gridview的oncreate方法中,它会等待加载数据但不显示progess栏(它只是在加载数据的末尾,而不是在它的过程中)。 所以我不知道正确的方法。

我认为从之前的活动开始只显示进度对话框,加载数据,最后开始gridview,但在我看来这不是一种经济方法......

你觉得怎么样?

那么:如何从asynk任务将数据附加到适配器? 我尝试使用notyfydatasetchange但它不起作用

在我的onCreate方法中,我有:     mAdapter = new ImageAdapter(this);     mGrid.setAdapter(mAdapter);

但是相同的适配器构造函数需要数据...(至少对象的数量......)

这是我的适配器:

public class ImageAdapter extends BaseAdapter{
    Context mContext;   
    public  final int ACTIVITY_CREATE = dirObjList.size()*2;
    public ImageAdapter(Context c){
        mContext = c;
        map = new HashMap<Integer,SoftReference<Bitmap>>();
    }
    public Map<Integer,SoftReference<Bitmap>> map;
    @Override
    public int getCount() {
        return dirObjList.size();
    }
    public  RowData getItem(int position) {
        return dirObjList.get(position);
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        RowData currDirObj= getItem(position);
        if(convertView==null){
            LayoutInflater li = getLayoutInflater();
            convertView = li.inflate(R.layout.icon, null);
            holder = new ViewHolder();
            holder.tv = (TextView)convertView.findViewById(R.id.icon_text);
            holder.iv = (ImageView)convertView.findViewById(R.id.icon_image);
            convertView.setTag(holder);

            }
        else{
                    holder = (ViewHolder)convertView.getTag();
            }

        holder.iv=setThumbs(holder.iv,position);
        holder.tv.setText(currDirObj.mTitle);

        convertView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                SharedPreferences indexPrefs = getSharedPreferences("currentIndex",
                        MODE_PRIVATE);

                SharedPreferences.Editor indexEditor = indexPrefs.edit();
                indexEditor.putInt("currentIndex", 0);

                SharedPreferences drPrefs = getSharedPreferences("currentDir",
                        MODE_PRIVATE);

                SharedPreferences.Editor drPath = drPrefs.edit();
                drPath.putString("currentDir", dirObjList.get(position).mDetail);                   


                drPath.commit();
                final Intent intent = new Intent(ImageGrid.this, SpeakinGallery.class);
                startActivity(intent);

            }
        });
        return convertView;
    }
}

这是我的异步任务

public class MyTask extends AsyncTask<Void, Void, String> {
  ProgressDialog progress;
      public MyTask(ProgressDialog progress) {
          this.progress = progress;
      }

      public void onPreExecute() {
        progress.show();
      }

      public String doInBackground(Void...unused) {
          getSubDirs(startDIRECTORY);
          return "foo";
      }

      public void onPostExecute(Void unused) {
          progress.dismiss();
          //mAdapter.notifyDataSetChanged();
      }
}

1 个答案:

答案 0 :(得分:0)

AsyncTask绝对是你的朋友。我发现在AsyncTask类中创建ProgressDialog的成员实例非常有效。假设您有一个名为MyActivity的Activity类。创建一个名为DownloadTask的内部类。

private class DownloadTask extends AsyncTask<Object, Void, Object> {

    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(MyActivity.this, "", "Loading...");
    }

    @Override
    protected Object doInBackground(Object... params) {
         // download information and return it
        return dataObject;
    }

    @Override
    protected void onPostExecute(Object result) {
         // use result object from background task and
         // attach data to adapter
        dialog.dismiss();
    }

}

然后在你的onCreate()方法中,调用new DownloadTask().execute();