Как добавить индикатор в GridView - PullRequest
0 голосов
/ 24 сентября 2011

Я новичок в программировании Android, так что, возможно, это глупый вопрос ... Я много читал об асинхронной задаче, чтобы добавить индикатор выполнения, но не могу найти нужное решение:

Мне нужно показать сетку, но мне нужно искать данные на изображениях и текстах, чтобы показать в ней. Поэтому, если я загружаю относительные данные в массив в асинхронной задаче, адаптер сетки не имеет данных и вылетает. В противном случае, если я добавлю диалог прогресса в метод oncreate gridview, он будет ждать загрузки данных, но не отображать панель progess (только в конце загрузки данных, а не во время нее). Так что я не знаю правильный подход.

Я думал начать с предыдущего занятия только для того, чтобы показать диалоговое окно прогресса, загрузить данные и, в конце, запустить просмотр таблицы, но мне не кажется, что это экономический подход ...

что ты думаешь?

Итак: Как я могу прикрепить данные к адаптеру из задачи asynk? Я пытался с notyfydatasetchange, но он не работает

в моем методе onCreate у меня есть: mAdapter = новый ImageAdapter (это); 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 голосов
/ 24 сентября 2011

AsyncTask, безусловно, ваш друг. Я считаю, что это очень хорошо работает для создания экземпляра ProgressDialog внутри вашего класса AsyncTask Допустим, у вас есть класс Activity с именем MyActivity. Создайте внутренний класс с именем 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();

...