CheckBox [] con onClickListener []?

EDIT: esta pregunta está mayormente cerrada y los únicos problemas que tengo con este código se discutenaqu

Para parte de mi aplicación, tengo una página de elementos que se representan como casillas de verificación, cada uno con un booleano asociado que eventualmente se recopila y almacena como una cadena de la siguiente manera:

final CheckBox gas_oil = (CheckBox) findViewById(R.id.gas_oil);
gas_oil.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
    {
    if (gas_oil.isChecked())
        {
        impacts.append(getString(R.string.gas_oil) + " | ");
        anythingchecked = true;
        }
    }
});

esto es extremadamente tedioso y no parecía ser una forma muy eficiente de hacerlo, ya que tengo 9 o 10 elementos que los usuarios pueden verificar o no. también este método significa que si hacen clic y dejan de hacer clic en algo, ese elemento todavía está en laStringBuilder impacts y que si vuelven a hacer clic, está allí dos veces.

Mi solución fue tener todo en matrices:

  String[] impactsn = getResources().getStringArray(R.array.impacts);
  final boolean[] impactsb = new boolean[impactsn.length];
  final CheckBox[] impactsc = new CheckBox[impactsn.length];
  View[] impactsv = new View[]{findViewById(R.id.gas_oil),findViewById(R.id.ghost_fishing),findViewById(R.id.marsh_damage),findViewById(R.id.nav_haz),findViewById(R.id.shell_damage),findViewById(R.id.waste_pollution),findViewById(R.id.wild_entang),findViewById(R.id.other)};

  for (int i = 0; i < impactsn.length; i++)
    {
    impactsc[i] = (CheckBox) impactsv[i];
    impactsc[i].setOnClickListener(new OnClickListener()
            {   
            @Override
            public void onClick(View v)
                {
                if (impactsc[i].isChecked())
                    impactsb[i] = true;
                else
                    impactsb[i] = false;
                }
            });
    }

esafortunadamente, hacer esto causa el problema de que (hasta donde yo entiendo) las cosas dentro de unOnClickListener tiene que ser final. Con el código como está escrito,i nunca puede ser final, así que estoy un poco parado.

¿Debería / puedo tener una matriz deOnClickListeners ¿también? ¿Debería llamar a un método fuera del código que tengo aquí?

Además, a continuación se muestra el getter que estaba planeando usar, creo que esa parte funcionará bien:

String getImpacts ()
    {
            String[] impactsn = getResources().getStringArray(R.array.impacts);
    StringBuilder impactss = new StringBuilder();
    for (int i = 0; i < impactsn.length; i ++)
        {
        if (impactsb[i])
                    impactss.append(impactsn[i] + " | ");
        }
    return String.valueOf(impactss);
    }

EDIT: esta es la versión del código que estoy ejecutando ahora:

package com.citsci.mardeb;

import android.app.Activity; importar android.content.res.Resources; importar android.os.Bundle; importar android.view.View; importar android.widget.CheckBox; importar android.widget.EditText;

public class Impacts extiende la actividad implementa View.OnClickListener {int length = 7; boolean [] impactb = new boolean [] {false, false, false, false, false, false, false, false}; Vista Editar texto;

public void onCreate (Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.impacts);

// for (int i = 0; i <length; i ++) // impactb [i] = false;

  View[] impactsv = new View[]
     {
    findViewById(R.id.gas_oil),
        findViewById(R.id.ghost_fishing),
        findViewById(R.id.marsh_damage),
        findViewById(R.id.nav_haz),
        findViewById(R.id.shell_damage),
        findViewById(R.id.waste_pollution),
        findViewById(R.id.wild_entang),
        findViewById(R.id.other)
        };

  CheckBox[] impactsc = new CheckBox[length];

  for (int i = 0; i < length; i++)
     {
     impactsc[i] = (CheckBox) impactsv[i];
     impactsc[i].setOnClickListener(this);
     }

}// end of onCreate

@Override
public void onClick(View v)
    {
  switch (v.getId()) {
     case (R.id.gas_oil):
        impactsb[0] =! impactsb[0];
        break;
     case (R.id.ghost_fishing):
        impactsb[1] =! impactsb[1];
        break;
     case (R.id.marsh_damage):
        impactsb[2] =! impactsb[2];
        break;
     case (R.id.nav_haz):
        impactsb[3] =! impactsb[3];
        break;
     case (R.id.shell_damage):
        impactsb[4] =! impactsb[4];
        break;
     case (R.id.waste_pollution):
        impactsb[5] =! impactsb[5];
        break;
     case (R.id.wild_entang):
        impactsb[6] =! impactsb[6];
        break;
     case (R.id.other):
        impactsb[7] =! impactsb[7];
        }
    }

String getImpacts ()
    {
    String[] impactsn = new String[length];
    Resources myResources = getResources();
    impactsn = myResources.getStringArray(R.array.impacts);
  StringBuilder impactss = new StringBuilder();
    for (int i = 0; i < length; i ++)
        {
        if (impactsb[i])
            impactss.append(impactsn[i] + " | ");
        }
    if (String.valueOf(impactss) != "")
        impactss.insert(0, "Impacts: ");
    return String.valueOf(impactss);
    }
}// end of Impacts.class

Respuestas a la pregunta(3)

Su respuesta a la pregunta