2011-01-30 30 views
0

我作爲我的第一個Android應用程序工作在戰艦遊戲。如何在ViewSwitcher動畫發生之前更新GridView?

我決定使用一個包含兩個GridView的ViewSwitcher。 One bUserGrid用於User字段(託管用戶船),bComputerGrid用於計算機字段(顯示用戶鏡頭)。

GridView bComputerGrid, bUserGrid, mComputerGrid, mUserGrid; 
ViewSwitcher bigSwitcher, miniSwitcher; 

用戶罷工(水龍頭計算機領域)。該應用程序運行的AsyncTask userAttack它定義了罷工是否成功與否。

bComputerGrid.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
    runUserAttack(position); 
    } 
}); 

如果用戶錯過了,那麼在userAttack一個onPostExecute()節我打電話notifyDataSetChanged()以刷新bComputerGrid

protected void onPostExecute(String message) { 
     ... 
     bComputerAdapter.notifyDataSetChanged(); 
     mComputerAdapter.notifyDataSetChanged(); 
     firstmateMsg.setText(message); 
     mUserBundle = mUserAttack.getmUBundle(); 
     mUserAttack=null; 
     if (isCancelled()) return; 
     if (mUserBundle.getBoolean("userMissed")) { 
      mComputerAttack = new computerAttack(); 
      mComputerAttack.execute(mComputerBundle); 
     } else { 
      if (doesWon(seqComputerShips)) { 
       showDialog(0); 
      } 
     } 
    } 

但它不會發生!以下語句不更新bComputerGrid,如果用戶錯過。

bComputerAdapter.notifyDataSetChanged(); 

那麼這裏onPostExecute()userAttack第一節開始的AsyncTask computerAttack。在onPreExecute()computerAttack第一節切換bComputerGridbUserGrid通過調用

bigSwitcher.showNext(); 

交換髮生,但bComputerGrid尚未在此之前更新!

電腦做它的罷工,併成功地通過調用bUserAdapter.notifyDataSetChanged()將刷新onProgressUpdate()computerAttack部分用戶領域。當計算機錯過時,應用程序會等待用戶再次敲擊(敲擊)。

protected void onProgressUpdate(String... messages) { 
     ... 
     mUserAdapter.notifyDataSetChanged(); 
     bUserAdapter.notifyDataSetChanged(); 

    } 
    protected void onPostExecute(Boolean result) { 
     mComputerBundle = mComputerAttack.getmCBundle(); 
     mComputerAttack=null; 
     if (field_switch) { 
      switchViews(); 
     } 

    } 

但爲什麼我不能刷新bComputerGrid是切換前和電腦射擊會發生什麼?

你能幫我嗎?

+0

在更改適配器的基礎數據之前,您確定沒有調用notifyDataSetChanged()嗎?在bComputerAdapter.notifyDataSetChanged()中設置斷點。並看看會發生什麼。 – fiction 2011-01-30 15:13:33

+0

感謝您的關注,虛構!在調用notifyDataSetChanged()之前,我設置了斷點並確保底層數組的更改。 – captaindan 2011-01-30 16:13:04

回答

0

在哪裏更新適配器?您更改適配器的基礎數據,或者更改適配器列表? 適配器也是UI的一部分,所以適配器本身的更改只應在GUI線程中進行。我在一些服務線程中更改了適配器內容後,在一些其他項目中得到了一些UI異常(在顯示中)告訴我。 最終,您必須重新創建適配器列表才能反映基礎數據的變化?

相關問題