0

我是android編程的初學者,所以也許這是一個愚蠢的問題... 我讀了很多關於添加進度條的異步任務,但我找不到解決方案我需要:如何將進度條添加到gridview中

我必須顯示網格視圖,但我需要搜索圖像和文本的數據以顯示它。 因此,如果我加載數組中的相關數據在一個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(); 
     } 
} 
+0

什麼是您的AsyncTask是什麼樣子? –

回答

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

+0

這可能是一個單獨的問題。你使用什麼樣的適配器? –

+0

謝謝,我會堅持這樣。我編輯的問題,以添加一些我的代碼... – mmmx

+0

因此, 我在我的getSubDirs(startDIRECTORY)函數 有一些錯誤,並注意到doInBackground從onPostExecute方法的參數返回一個不同的類型,防止異步任務正常工作 現在它工作! 感謝您向我展示正確的方法! – mmmx