【问题标题】:how to add a progress bar to a gridview如何将进度条添加到gridview
【发布时间】:2011-09-24 14:33:32
【问题描述】:

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

我必须显示一个网格视图,但我需要搜索图像和文本上的数据以显示在其中。 因此,如果我在异步任务的数组中加载相关数据,则网格的适配器没有数据并崩溃。 否则,如果我将进度对话框放在 gridview 的 oncreate 方法中,它会等待加载数据但不显示进度条(它只是在加载数据结束时,而不是在加载数据期间)。 所以我不知道正确的方法。

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

你怎么看?

那么:如何将数据从异步任务附加到适配器? 我尝试了 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();
      }
}

【问题讨论】:

  • 你的异步任务是什么样的?

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


【解决方案1】:

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();

【讨论】:

  • 这可能完全是一个单独的问题。您使用的是哪种适配器?
  • 谢谢,我会坚持这种方式。我编辑了问题以添加我的一些代码...
  • 所以,我的 getSubDirs(startDIRECTORY) 函数中有一些错误,并且还注意到 doInBackground 返回了与 onPostExecute 方法的参数不同的类型,从而阻止了异步任务现在可以正常工作!!!谢谢你告诉我正确的方法!
猜你喜欢
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多