Флажки в операторе if внутри цикла for работают в обратном порядке

У меня есть цикл for, который отображает 2 текстовых просмотра и флажок в каждой из моих таблиц в макете таблицы. У меня есть оператор if, который показывает тост для проверки функции isChecked флажка, но оператор if работает обратно, за исключением последней строки таблицы. Почему это так и как мне это исправить?

for (Integer j = 0; j < count; j++)
        {

            tableRow1 = new TableRow(getApplicationContext());
            textViewMaster = new TextView(getApplicationContext());
            textViewMaster.setText(c.getString(c.getColumnIndex("StudentID")));
            textViewMaster.setPadding(20, 20, 20, 20);
            textViewMaster.setTextColor(getResources().getColor(R.color.redactionbar));
            textViewMaster.setTextSize(TypedValue.COMPLEX_UNIT_DIP,25);
            textViewMaster.setTypeface(null, Typeface.BOLD);
            tableRow1.addView(textViewMaster);

            textViewMaster2 = new TextView(getApplicationContext());
            textViewMaster2.setText(c.getString(c.getColumnIndex("LastName")));
            textViewMaster2.setPadding(20, 20, 20, 20);
            textViewMaster2.setTextColor(getResources().getColor(R.color.redactionbar));
            textViewMaster2.setTextSize(TypedValue.COMPLEX_UNIT_DIP,25);
            textViewMaster2.setTypeface(null, Typeface.BOLD);
            tableRow1.addView(textViewMaster2);

            tableRow1.setClickable(true);
            tableRow1.setLongClickable(true);
            tableLayout1.setClickable(true);


            checkBox = new CheckBox(getApplicationContext());
            checkBox.setChecked(true);

            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
            {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b)
                {
                    if (checkBox.isChecked())
                    {
                        searchView.setEnabled(false);
                        arrayList.add(container1);
                        arrayList2.add(container2);
                        arrayList3.add(container3);
                        Toast toast = Toast.makeText(getApplicationContext(),"Its checked", Toast.LENGTH_SHORT);
                        toast.show();

                    }

                    else
                    {
                        arrayList.remove(container1);
                        arrayList2.remove(container2);
                        arrayList3.remove(container3);
                        Toast toast = Toast.makeText(getApplicationContext(), "Its not checked", Toast.LENGTH_SHORT);
                        toast.show();
                    }
                }
            });

            checkBox.setVisibility(View.VISIBLE);
            tableRow1.addView(checkBox);
            tableLayout1.addView(tableRow1);

            c.moveToNext() ;
        }

Любая помощь очень ценится!

2 ответа

Решение

В текущей реализации checkBox удерживать последний объект CheckBox, который создается во время последней итерации for loop так что используйте второй параметр onCheckedChanged метод, который если true означает, что CheckBox отмечен, если не проверен:

 @Override
  public void onCheckedChanged(CompoundButton compoundButton, boolean b)
   {
     if (b){ // or use compoundButton.isChecked()
       // code if checkbox is checked    
     } else{
       // code if checkbox is not checked
      }
}

Вы должны использовать предложение в другом ответе, но это также будет работать и будет техникой, которую вы будете использовать, когда у вас нет параметра, который вы можете использовать:

Создайте новую локальную переменную, а не поле, поэтому отличается для каждого цикла и пометить как final чтобы иметь возможность использовать его из анонимного класса.

final CheckBox checkBox = new CheckBox(getApplicationContext());

//rest is same
checkBox.setChecked(true);

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b)
    {
        if (checkBox.isChecked())
        {
        }
        else
        {
        }
    }
});
Другие вопросы по тегам