for 循环中 if 语句中的复选框反向工作

Checkboxes in if statement inside a for loop work in reverse

我有一个 for 循环,它在 table 布局中的每个 table 行中显示 2 个文本视图和一个复选框。我有一个 if 语句,它显示了一个 toast 来测试复选框的 isChecked 函数,但是 if 语句相反地工作,除了最后的 table 行。为什么会这样,我该如何解决?

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() ;
        }

非常感谢任何帮助!

在当前实现中 checkBox 保存在 for loop 的最后一次迭代期间创建的最后一个 CheckBox 对象,因此使用 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 以便能够从匿名 class.[=12= 中使用它]

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
        {
        }
    }
});