2013-04-29 33 views
1

今天我有一個奇怪的問題。我試圖實現一個遊戲,我有一些按鈕的GridView。當任何按鈕被點擊時,它將被禁用(使用setEnabled(false))。問題是,只有第一個按鈕沒有被禁用。雖然日誌輸出顯示setEnabled(false)被調用。Gridview setEnabled不適用於第一項

這裏是我的代碼:

public class ButtonAdapter extends BaseAdapter { 

    private LayoutInflater inflater; 
    private GameScreen gameScreen; 
    private Hangman hangman; 
    private static final String[] buttonValues = 
     { 
      "A", "B", "C", "D", "E", "F", "G", 
      "H", "I", "J", "K", "L", "M", "N", 
      "O", "P", "Q", "R", "S", "T", "U", 
      "", "V", "W", "X", "Y", "Z", "" , 
     }; 
    private Button[] holder = new Button[getCount()]; 

    public ButtonAdapter(GameScreen gameScreen) { 
     inflater = (LayoutInflater) gameScreen 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     this.gameScreen = gameScreen; 
    } 

    public View getView(final int position, View convertView, ViewGroup arg2) { 
     View view = convertView; 
     if(view == null) { 
      view = inflater.inflate(R.layout.game_button, null); 

      final Button button = (Button) view.findViewById(R.id.button); 
      button.setText(buttonValues[position]); 
      holder[position] = button; 
      view.setTag(holder[position]); 
     } 
     else 
      holder[position] = (Button) view.getTag(); 

     holder[position].setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       if(buttonValues[position].length() != 0) { 
        Hangman.GameState gameState = hangman.updateCurrentWord(
          buttonValues[position].charAt(0)); 
        holder[position].setEnabled(false); 

        gameScreen.updateView(gameState); 
        Log.d("Button", position + ":" + holder[position].getText()); 
       } 
      } 
     }); 

     return view; 
    } 

    public int getCount() { 
     return buttonValues.length; 
    } 

    public Object getItem(int position) { 
     return buttonValues[position]; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public boolean areAllItemsEnabled() { 
     return false; 
    } 

    @Override 
    public boolean isEnabled(int position) { 
     return holder[position].isEnabled(); 
    } 
} 

我也試過((Button) view.findViewById(R.id.button)).setOnClickListener(...);,但沒有任何變化。

+0

請您詳細說明一下。但試試這個 - 'if(view == null){view = inflater.inflate(R.layout.game_button,null);}' 並讓按鈕單擊偵聽器被重新添加。我不明白你如何使用持有人[position] = button;因爲它是一個可以被系統回收的視圖值,所以不知道你打算如何使用它。 – 2013-04-29 18:22:44

+0

不相關,但你的鑰匙圈應該閱讀HIJK,而不是HIGK – dberm22 2013-04-29 19:57:39

+0

@AshwiniBhangi,我已經編輯了我的代碼,現在每次都會添加「OnClickListener」。但現在第一個項目沒有被禁用,當我點擊它。 – 2013-04-30 06:36:04

回答

4

有時會發生這些事情,因爲您試圖訪問尚未充氣的視圖。試試這個:

View view = convertView; 

    if(view == null) 
    { 
     view = inflater.inflate(R.layout.game_button, null); 
     vto = view.getViewTreeObserver(); 
     vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Override public void onGlobalLayout() 
     { 
      final Button button = (Button) view.findViewById(R.id.button); 
      button.setText(buttonValues[position]); 
      holder[position] = button; 
      view.setTag(holder[position]); 

      ViewTreeObserver obs = view.getViewTreeObserver(); 
      obs.removeGlobalOnLayoutListener(this); 
     }}); 
    ... 

或者可能把ViewTreeObserver放在其他地方。這一切都取決於代碼首先輸入if statement的哪一側。

相關問題