i have an activity that shows a listview with 2 rows. Each row has a question, which is pulled from the DB and 2 buttons on ech row, A YES button and a NO button.
I am trying to set the pressed state of the user's choice on each button per row. so if the user hits the light green YES button, then it turns darker green to indicate selected and the red NO button should be unselected.
What is happening is if i hit the YES button on row one, the state of the YES button on row 2 changes instead.
I've placed a structure in the class to hold the states but it is not working correctly.Has anyone any ideas as to why this is not working correctly?
public class CarerRetentionQuestionsActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>{ private static final String TAG = CarerRetentionQuestionsActivity.class.getSimpleName(); NfcScannerApplication appObj; Cursor cursor; ListView listViewQuestions; MyAdapter myAdapter; LoaderManager loadermanager; CursorLoader cursorLoader; Context context; Cursor c; Button buttonYes; Button buttonNo; Button submit; private boolean[][] buttonStates; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_carer_retention); loadermanager = LoaderManager.getInstance(this); appObj = (NfcScannerApplication) getApplication(); context = this; getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setIcon(R.drawable.beeactionbar); setTitle("Carer Wellbeing"); listViewQuestions = (ListView) findViewById(R.id.listviewcarerretention); submit = (Button) findViewById(R.id.buttoncarerwellbeingsubmit); submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e(TAG, "submit clicked"); String res2 = appObj.loginValidate.haveCarerRetentionQuestionsBeenAsked(); if (res2 != null && res2.equalsIgnoreCase("YES")) { Intent i = new Intent(CarerRetentionQuestionsActivity.this, NfcscannerActivity2.class); i.setAction("QRCODE_ACTION"); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); } } }); Cursor anyquestionsInDB = appObj.loginValidate.queryAllFromCarerRetentionQuestions(); if(anyquestionsInDB != null && anyquestionsInDB.getCount() == 0) { ContentValues cv = new ContentValues(); cv.putNull(LoginValidate.C_ID_CARERRETENTIONQUESTIONTIME); cv.put(LoginValidate.C_CARERRETENTIONQUESTIONTIME_QUESTION, "Do you feel supported in your role?"); cv.putNull(LoginValidate.C_CARERRETENTIONQUESTIONTIME_TIMESTAMP); cv.putNull(LoginValidate.C_CARERRETENTIONQUESTIONTIME_ANSWER); cv.putNull(LoginValidate.C_CARERRETENTIONQUESTIONTIME_SENTTOSERVER); appObj.loginValidate.insertCarerRetentionQuestions(cv); ContentValues cv2 = new ContentValues(); cv2.putNull(LoginValidate.C_ID_CARERRETENTIONQUESTIONTIME); cv2.put(LoginValidate.C_CARERRETENTIONQUESTIONTIME_QUESTION, "Are you happy with the number of hours we are asking you to deliver?"); cv2.putNull(LoginValidate.C_CARERRETENTIONQUESTIONTIME_TIMESTAMP); cv2.putNull(LoginValidate.C_CARERRETENTIONQUESTIONTIME_ANSWER); cv2.putNull(LoginValidate.C_CARERRETENTIONQUESTIONTIME_SENTTOSERVER); appObj.loginValidate.insertCarerRetentionQuestions(cv2); } try{ anyquestionsInDB.close(); }catch(Exception e){} String[] from = { C_CARERRETENTIONQUESTIONTIME_QUESTION}; int[] to = { R.id.rowcarerretentionquestion}; myAdapter = new MyAdapter(appObj, R.layout.rowcarerretention, null, from, to, 0); listViewQuestions.setAdapter(myAdapter); loadermanager.initLoader(1, null, this); }//END OF onCreate private class MyAdapter extends SimpleCursorAdapter { public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { super(context, layout, c, from, to, flags); buttonStates = new boolean[getCount()][2]; // Initialize button states array based on the count of items in the list // Initially set all buttons to not selected for (int i = 0; i < getCount(); i++) { buttonStates[i][0] = false; // Yes button buttonStates[i][1] = false; // No button } } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.e(TAG, "inside myadapter getview"); View v = super.getView(position, convertView, parent); if(v == null) return null; c = (Cursor)getItem(position); final String question = c.getString(c.getColumnIndexOrThrow(C_CARERRETENTIONQUESTIONTIME_QUESTION)); ((TextView)v.findViewById(R.id.rowcarerretentionquestion)).setText( question); Log.e(TAG, "question is set, about to inflate yes/no buttons"); buttonYes = (Button) v.findViewById(R.id.rowcarerretentionbuttonyes); buttonNo = (Button) v.findViewById(R.id.rowcarerretentionbuttonno); buttonYes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e(TAG, "button yes clicked"); // Toggle the state of the Yes button buttonStates[position][0] = !buttonStates[position][0]; // Set the No button state to not selected buttonStates[position][1] = false; // Update the visual appearance of buttons updateButtonState(position); //---------------- buttonYes.setSelected(true); buttonNo.setSelected(false); DateTime dt = new DateTime(); long dtmills2 = dt.getMillis(); appObj.loginValidate.updateCarerRetentionQuestionsAsBeenAsked(question, "YES", dtmills2); } }); buttonNo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e(TAG, "button no clicked"); // Toggle the state of the No button buttonStates[position][1] = !buttonStates[position][1]; // Set the Yes button state to not selected buttonStates[position][0] = false; // Update the visual appearance of buttons updateButtonState(position); //------------------------- buttonYes.setSelected(false); buttonNo.setSelected(true); DateTime dt2 = new DateTime(); long dtmills2 = dt2.getMillis(); appObj.loginValidate.updateCarerRetentionQuestionsAsBeenAsked(question, "NO", dtmills2); } }); // Update the visual appearance of buttons based on their states updateButtonState(position); return v; } } // Method to update the visual appearance of buttons based on their states private void updateButtonState(int position) { // Get the current view from ListView View view = listViewQuestions.getChildAt(position - listViewQuestions.getFirstVisiblePosition()); if (view != null) { // Find the Yes and No buttons within the current view Button buttonYes = view.findViewById(R.id.rowcarerretentionbuttonyes); Button buttonNo = view.findViewById(R.id.rowcarerretentionbuttonno); // Update Yes button state if (buttonStates[position][0]) { // Set selected state appearance buttonYes.setBackgroundColor(ContextCompat.getColor(mContext, R.color.green1)); } else { // Set not selected state appearance buttonYes.setBackgroundColor(ContextCompat.getColor(mContext, R.color.green4)); } // Update No button state if (buttonStates[position][1]) { // Set selected state appearance buttonNo.setBackgroundColor(ContextCompat.getColor(mContext, R.color.red1)); } else { // Set not selected state appearance buttonNo.setBackgroundColor(ContextCompat.getColor(mContext, R.color.red4)); } } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { String[] projection = { LoginValidate.C_ID_CARERRETENTIONQUESTIONTIME, C_CARERRETENTIONQUESTIONTIME_QUESTION}; cursorLoader = new CursorLoader(this, RR3ContentProvider.CONTENT_URI_CARERRETENTION, projection, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor c) { if(myAdapter!=null && c !=null) myAdapter.swapCursor(c); //swap the new cursor in. else Log.e(TAG,"OnLoadFinished: mAdapter is null"); } @Override public void onLoaderReset(Loader<Cursor> arg0) { if(myAdapter!=null) myAdapter.swapCursor(null); else Log.e(TAG,"OnLoadFinished: mAdapter is null"); }}//end of class