new to android. I created 12 (3 rows, 4 columns) buttons in a GridView and I created a toast to display something after a button is pressed by following a tutorial. The buttons are displaying on the screen correctly, but the toast messages are not. When I press top left button, I get the bottom left toast. When I press middle left button, I get middle right toast. When I press bottom left button, I get top right toast.
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
Here’s the adapter code:
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;
}
}
and here’s the the activity code
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();
}
}
At first it seems the order of the toasts are reversed. So I tried doing
KeypadButtons keypadButton = mButtons[mButtons.length - 1 - position];
That fixed the bottom two rows but he top row is still reversed.
Thanks in advance.
Views are recycled (as you obviously know because you’re checking if the convertview is null). A simple fix here is to move the
btn.setTag(keypadButton); to outside of theif(convertView==null)` block and execute it always before you return from getView();