2012-07-12 30 views
0

我有一个ListView由一个SimpleAdapter填充,它从一个ArrayList的HashMap获取值。 ArrayList是通过从我的站点获取数据的方法load()构建的。我有一个菜单选项,允许通过再次获取刷新数据并调用adapter.notifyDataSetChanged(),它实际上工作正常,更新数组列表并刷新ListView。现在,load()需要几秒钟来建立http连接并获取数据,所以我想设置一个ProgressDialog来通知用户正在进行的过程。我知道我不能把ProgressDialog放在UI线程上,因为load()工作,所以我尝试了一个AsyncTask。它工作正常,显示对话框,而新数据被提取并传递给适配器,但它也增加了一个问题:ListView不再刷新显示的项目,除非我将修改后的列表项目移出屏幕,回来,那么它会显示新的内容。我可以做什么来同时进行ProgressDialog和列表内容的刷新?
这与ProgressDialog中的AsyncTask代码(编辑数据,但不会触发屏幕列表刷新):ProgressDialog,同时刷新ListView

public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.update: {   
     loading.show(); //the ProgressDialog 
     AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... params) {     
       load(); //fetching data, takes a while 
       return null; 
      } 
      @Override 
      protected void onPostExecute(Void result) {          
       loading.dismiss(); 
      } 

     };   
     loadingTask.execute(); 
     adapter.notifyDataSetChanged();   
     return true; 
    } 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

这是会刷新的ListView以及后面的数据的代码(但不会让我建立了一个ProgressDialog):

public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.update: {               
     load(); 
     adapter.notifyDataSetChanged();      
     return true; 
    } 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

回答

0

刚刚从它添加AsycTaskonPreExecute()show()ProgressDialog。并将adapter.notifyDataSetChanged();放入的AsyncTask

一样,

AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected void onPreExecute() {          
      loading.show(); //the ProgressDialog 
     } 

     @Override 
     protected Void doInBackground(Void... params) {     
      load(); //fetching data, takes a while 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      adapter.notifyDataSetChanged();           
      loading.dismiss(); 
     } 

    };   
    loadingTask.execute();  
    return true; 
+0

也动'adapter.notifyDataSetChanged();''在onPostExecute()' – 2012-07-12 09:46:45

+0

@MMohsinNaeem - 我的打字错误,我更新的答案。感谢它。 – user370305 2012-07-12 09:47:55

+0

它的工作方式非常完美。非常感谢大家! – devrocca 2012-07-12 10:28:39