2014-10-20 92 views
0

我有以下OnCreateMethod()爲什麼我似乎無法從oncreate更新我的gridview?

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_siege_main); 
    mContext = getApplicationContext(); 

    gridview = (GridView) findViewById(R.id.gridview_board); 
    initialBoard = new Board(); 
    initialBoard.generate(Globals.rand_width, 
      Globals.rand_height, 
      Globals.rand_low, 
      Globals.rand_high); 

    gridview.setAdapter(new BoardAdapter(this)); 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      //updateGameState(initialBoard); 
     } 
    }); 

    updateGameState(initialBoard); 

    //typography 
    TextView boardName = (TextView) findViewById(R.id.textview_board_name); 
    boardName.setText("Uncharted Territory"); 
    Toast.makeText(SiegeMainActivity.this, "Uncharted Territory loaded", Toast.LENGTH_SHORT).show(); 

    Typeface face = Typeface.createFromAsset(getAssets(), 
      "fonts/calibri-1.ttf"); 
    boardName.setTypeface(face); 

    TextView pl1Name = (TextView) findViewById(R.id.textViewPlayer1Name); 
    face = Typeface.createFromAsset(getAssets(), 
      "fonts/calibri-1.ttf"); 
    pl1Name.setTypeface(face); 

    TextView pl2Name = (TextView) findViewById(R.id.textViewPlayer2Name); 
    face = Typeface.createFromAsset(getAssets(), 
      "fonts/calibri-1.ttf"); 
    pl2Name.setTypeface(face); 

} 

和我updateGameState()方法是這樣的:

private void updateGameState(Board b) { 
    int [] vals = b.getLinearVals(); 
    int [] plays = b.getLinearPlays(); 
    int [] score = b.getScore(); 
    int turns = b.getTurns(); 

    Button tile; 
    //updating board 
    for(int i=0;i<gridview.getChildCount();i++){ 
     tile = (Button)gridview.getChildAt(i); 
     tile.setText(""+vals[i]); 

     if(plays[i]==1) 
      tile.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.btn_default_normal_green)); 
     else if (plays[i]==2) 
      tile.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.btn_default_normal_blue)); 
    } 

    //Setting the score 
    Button pl1Score, pl2Score; 
    pl1Score = (Button) findViewById(R.id.buttonPlayer1Score); 
    pl2Score = (Button) findViewById(R.id.buttonPlayer2Score); 
    pl1Score.setText(""+score[0]); 
    pl2Score.setText(""+score[1]); 
} 

當我調用的OnCreate updateGameState()創建適配器後,應填寫有一些值的按鈕。但它似乎並不奏效。但是當我點擊時做同樣的事情(在點擊監聽器中註釋掉),它似乎工作正常。我想在加載頁面時填充值。有人能幫助我嗎?

回答

0

您需要讓GridView知道數據已更改。如果您要動態更改ArrayAdapter中的數據,則需要撥打BoardAdapter.notifyDataSetChanged()以便GridView可以使用新數據「刷新」自己。

對於您的情況,您需要爲您創建一個新的BoardAdapter的引用,然後用它來調用notifyDataSetChange()方法。

private BoardAdapter boardAdapter = null; 

protected void onCreate(Bundle savedInstanceState) { 
    // your things 
    boardAdapter = new BoardAdapter(this); 
    gridview.setAdapter(boardAdapter); 
    // more things 
} 

private void updateGameState(Board b) { 
    // update your data  
    boardAdapter.notifyDataSetChanged(); 
} 

編輯:您在您嘗試使用ArrayAdapter註釋中,並沒有爲你工作...也許嘗試this,這表示使用GridView小號invalidateViews()方法。 gridView.invalidateViews()

+0

這不起作用。正如我所說,當我點擊gridview時,它確實得到更新。當我執行你的,甚至不會發生 – aceBox 2014-10-20 15:02:05

+0

嗯。檢查編輯,看看是否有效。起初我沒有注意到你直接在GridView中修改視圖,而不是修改適配器將引用的視圖列表(在我看來,這是正確的方式)。使用什麼適合你=) – AnxGotta 2014-10-20 15:12:40

0

看一看這太問題&答案在這裏:

How to refresh a GridView?

我也有類似的問題,但不能讓它即使是在一個按鈕點擊刷新,甚至儘管項目正在更改並添加。就我而言,訣竅就是使用新的/更新的項目列表重新創建(在您的情況下)BoardAdapter,然後將其重新分配給gridview。

gridViewAdapter = new MyGridViewAdapter(this, blah, yourUpdatedItems); 
discoverGridView.InvalidateViews(); 
discoverGridView.Adapter = gridViewAdapter; 

我相信必須有這樣做的更好的,更具反應性,方式,但是這至少得到了我的理念和運行的證明。

相關問題