Android Java: Utilizar setOnClickListener en el bucle for

Estoy en las primeras etapas del desarrollo de Android y tuve un problema con un bucle for .

Aquí está mi código:

 for (int i=0; i<=30; i++){ tableRows[i] = new TableRow(this); tableRows[i].setId(i); tableRows[i].setLayoutParams(tableRowParams); tableRows[i].setBackgroundResource(R.drawable.bg); textViews1[i] = new TextView(this); textViews1[i].setText("Eng Kelime " + i); textViews1[i].setTextSize(25); textViews1[i].setTextColor(Color.WHITE); textViews1[i].setId(i); textViews1[i].setPadding(20, 30, 0, 0); textViews1[i].setLayoutParams(Params2); tableRows[i].addView(textViews1[i]); textViews2[i] = new TextView(this); textViews2[i].setText("Tr Kelime " + i); textViews2[i].setTextSize(25); textViews2[i].setTextColor(Color.WHITE); textViews2[i].setId(i); textViews2[i].setPadding(30,30,0,0); textViews2[i].setLayoutParams(Params2); tableRows[i].addView(textViews2[i]); tableLayout.addView(tableRows[i]); textViews1[i].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //These textViews[i] veriables need to be declared final. //But I don't know how!.. if (textViews2[i].getVisibility() == View.VISIBLE) { textViews2[i].setVisibility(View.INVISIBLE); }else{ textViews2[i].setVisibility(View.VISIBLE); } } }); } 

Tengo TableRows y dos textViews en cada TableRows . Cuando hago clic en el primer textView1[i] , el segundo, textView2[i] será invisible o visible.

Pero en el bloque de código setOnClickListener tenía "variable" i "se accede desde dentro de la clase interna tiene que ser declarado final" código de error.

He declarado i como final , como for(final int i=0; i<=30; i++) . Entonces tuve un error diferente. "Variable 'i' No se puede declarar final"

Declare una nueva variable j y modifique su código como:

 final int j = i; textViews1[j].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (textViews2[j].getVisibility() == View.VISIBLE) { textViews2[j].setVisibility(View.INVISIBLE); }else{ textViews2[j].setVisibility(View.VISIBLE); } } }); 

Prueba esto. Esto funcionará.

Para acceder a una variable local de una clase interna, debe ser declarada final , por lo que no se puede cambiar externamente. Puede hacerlo utilizando una variable dummy adicional:

 final index = i; // here! textViews1[i].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (textViews2[index].getVisibility() == View.VISIBLE) { textViews2[index].setVisibility(View.INVISIBLE); }else{ textViews2[index].setVisibility(View.VISIBLE); } } }); 

Prueba esto:

 final TextView txtToToggle = textViews2[i]; textViews1[i].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (txtToToggle.getVisibility() == View.VISIBLE) { txtToToggle.setVisibility(View.INVISIBLE); } else { txtToToggle.setVisibility(View.VISIBLE); } } }); 

Te presento un truco muy simple a eso en Java, con JMenuItem, pero puedes hacer lo mismo para tu proyecto:

  package tests; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; public class MyMenu extends JMenuBar { private ArrayList<String> list = new ArrayList<String>(); private JMenu menu = new JMenu("Menu"); private ArrayList<JMenuItem> jMenus = new ArrayList<JMenuItem>(); public MyMenu() { populateMenu(); createMenu(); createAction(); } private void populateMenu(){ for (int i = 0; i < 3; i++) { list.add("Object "+i); } } private void createMenu(){ for (int i = 0; i < list.size(); i++) { JMenuItem item = new JMenuItem(list.get(i)); jMenus.add(item); menu.add(item); } add(menu); } private void createAction(){ for (int i = 0; i < jMenus.size(); i++) { final int index = i; jMenus.get(i).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println(jMenus.get(index).getText()); } }); } } } 

He declered "i" como final como "para (int final i = 0; i <= 30; i ++)". Entonces tuve un error diferente. "Veriable 'i' No se puede declarar final"

Declarar i como final significa que no puede cambiar el valor de i . Por lo tanto, i ++ sería inválido. No se puede declarar i como final en un bucle for .

Un camino sería crear una nueva variable, digamos j , como final y asignarle el valor de i . En clase interna, utilice j en lugar de i como se indica en @ZygoteInit.

  • Problema con MulticastSocket en Java-Android
  • Cómo hacer animación de traducción para cada elemento de vista de lista
  • ¿Cómo puedo hacer peticiones simultáneas más rápido con Retrofit / OkHttp?
  • Mantenimiento de la sesión HTTP al acceder a un servlet desde Android
  • ¿Cómo puedo inhabilitar el sonido de clic cuando se utiliza un elemento de vista de lista de Android / Java?
  • Cómo manejar arrastrar en una aplicación de ajedrez Android?
  • Cómo convertir de un ArrayList de matrices a una matriz de matrices
  • Registrarse como reproductor de música y reproducir canciones
  • Devuelve el recuento de registros en una variable, Sqlite, Android, Java
  • Android - Crossfade mutiple imágenes en un ImageView
  • ¿Cómo puedo convertir la cadena de const valor de clase int?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.