2012-09-05 42 views
1

新增至android。我在一個GridView中創建了12個(3行,4列)按鈕,並且我按照教程按下按鈕後創建了一個toast以顯示某些東西。這些按鈕正確顯示在屏幕上,但吐司消息不是。當我按左上角的按鈕時,我得到左下角的烤麪包。當我按左中按鈕時,我得到中間右烤麪包。當我按下左下角按鈕時,我得到頂部正確烤麪包。android:使用按鈕適配器創建的按鈕的順序不正確

Visually: 

button location: 
1 2 3 4 
5 6 7 8 
9 10 11 12 

toast message 
9 10 11 12 
8 7 6 5 
4 3 2 1 

這裏的適配器代碼:

public class KeypadAdapter extends BaseAdapter { 
    private Context mContext; 

    // Declare button click listener variable 
    private OnClickListener mOnButtonClick; 

    // Method to set button click listener variable 
    public void setOnButtonClickListener(OnClickListener listener) { 
     mOnButtonClick = listener; 
    } 

    public KeypadAdapter(Context c) { 
     mContext = c; 
    } 

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

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

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

    private KeypadButtons[] mButtons = { KeypadButtons.ADD, 
      KeypadButtons.SUBTRACT, KeypadButtons.MULTIPLY, 
      KeypadButtons.DIVIDE, KeypadButtons.DET, KeypadButtons.INV, 
      KeypadButtons.POW2, KeypadButtons.POWN, KeypadButtons.TRANSPOSE, 
      KeypadButtons.NORM1, KeypadButtons.NORM2, KeypadButtons.NORMINF }; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Button btn; 
     if (convertView == null) { // if it's not recycled, initialize some 
            // attributes 
      btn = new Button(mContext); 
      KeypadButtons keypadButton = mButtons[position]; 
      if (keypadButton != KeypadButtons.DUMMY) { 
       btn.setOnClickListener(mOnButtonClick); 
      } 

      // Set CalculatorButton enumeration as tag of the button so that we 
      // will use this information from our main view to identify what to 
      // do 
      btn.setTag(keypadButton); 
     } else { 
      btn = (Button) convertView; 
     } 

     btn.setText(mButtons[position].getText()); 
     return btn; 
    } 

} 

和這裏的活動代碼

public class MainActivity extends Activity { 
    GridView mKeypadGrid; 
    KeypadAdapter mKeypadAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Get reference to the keypad button GridView 
     mKeypadGrid = (GridView) findViewById(R.id.gridView); 

     // Create Keypad Adapter 
     mKeypadAdapter = new KeypadAdapter(this); 

     // Set adapter of the keypad grid 
     mKeypadGrid.setAdapter(mKeypadAdapter); 

     // Set button click listener of the keypad adapter 
     mKeypadAdapter.setOnButtonClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Button btn = (Button) v; 
       // Get the KeypadButton value which is used to identify the 
       // keypad button from the Button's tag 
       KeypadButtons keypadButton = (KeypadButtons) btn.getTag(); 

       // Process keypad button 
       ProcessKeypadInput(keypadButton); 
      } 
     }); 

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

      } 
     }); 

    } 

    protected void ProcessKeypadInput(KeypadButtons keypadButton) { 
     // TODO Auto-generated method stub 
     Toast.makeText(
       MainActivity.this, 
       keypadButton.getText().toString() + " " 
         + keypadButton.toString(), Toast.LENGTH_SHORT).show(); 


    } 
} 

起初似乎敬酒的順序顛倒過來。所以我試着做

KeypadButtons keypadButton = mButtons[mButtons.length - 1 - position]; 

固定底部兩行但他頂行仍然顛倒。

在此先感謝。

回答

1

視圖被回收(因爲您明顯知道,因爲您正在檢查convertview是否爲空)。這裏的一個簡單的解決方法是移動btn.setTag(keypadButton); to outside of the if(convertView == null)塊並在getView()返回之前始終執行它。