Case à cocher[] avec onClickListener[]?

EDIT: cette question est la plupart du temps fermée et les seuls problèmes que j'ai avec ce code sont discutés ici

Pour une partie de mon application, j'ai une page d'éléments qui sont représentés comme des cases à cocher, chacun avec un associé booléen qui finalement être collectées et stockées comme une chaîne de caractères comme suit:

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

c'est extrêmement fastidieux et ne semble pas être un très efficace moyen de le faire depuis que j'ai 9 ou 10 éléments que les utilisateurs peuvent consulter ou pas. aussi cette méthode signifie que si ils cliquent et décochez quelque chose, que l'article est toujours dans le StringBuilder impacts et que si ils cliquez sur nouveau, puis il est là, à deux reprises.

Ma solution était d'avoir tout dans les tableaux:

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

malheureusement, cette opération entraîne le problème (comme je le comprends) des choses à l'intérieur d'un OnClickListener être final. Avec le code écrit, i ne peut jamais être en finale, donc je suis un peu au point mort.

Doit-on/peut-on avoir un tableau de OnClickListeners ainsi? Devrais-je appeler une méthode en dehors de la code que j'ai ici?

Également, ci-dessous s'agit de la lecture, j'ai été l'intention de l'utiliser, je pense que la partie va très bien fonctionner:

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: c'est la version de code im en cours d'exécution avec maintenant:

package com.citsci.mardeb;

import android.app.De l'activité;
import android.contenu.res.Ressources;
import android.os.Faisceau;
import android.vue.Vue;
import android.widget de.Case à cocher;
import android.widget de.EditText;

public class Impacts s'étend de l'Activité met en œuvre la Vue.OnClickListener
{
int longueur = 7;
boolean[] impactsb = new boolean[] {false, false, false, false, false, false, false, false};
EditText;

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

//for (int i = 0; i < longueur; i++)
//impactsb[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
Vous devez regarder dans l'aide de HashMaps pour stocker des données comme cela. Peut-être que vous pouvez expliquer ce que vous essayez de le faire à un niveau plus élevé? Cela ne semble pas être la bonne mise en œuvre pour moi.
haha vous pourrait tout à fait être bon, je vais faire tout comme je vais le long. brièvement, mon application est censée être une sorte de version intéressante de cette forme dhec formulaire. lorsque l'utilisateur a rempli le formulaire, cliquez sur soumettre et l'application collecte toutes les informations qu'ils ont présenté dans une chaîne de sorte qu'il peut être joint dans un mail, et soumis des. je n'ai aucune idée de ce que HashMaps sont pour le moment mais je vais regarder dans developer.android.com et sur ici et de voir si ceux qui semble le plus approprié.
désolé pour la mise en forme bâclée, j'ai utiliser les onglets et utilise DONC des espaces, ses frustrant va-et-vient.

OriginalL'auteur dylan murphy | 2011-06-02