Android Java: Using setOnClickListener in for loop

android, final, for-loop, java

Solution

Declare a new variable `j` and modify your code as:

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

Try this. This will work.

Problem

I'm in the early stages of android development and I had a problem with a `for` loop. Here is my code: ``` 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); } } }); } ``` I have `TableRows` and two `textViews` in each `TableRows`. When I click the first `textView1[i]`, the second one, `textView2[i]` will be invisible or visible. But in `setOnClickListener` code block I had "variable 'i' is accessed from within inner class needs to be declared final" error code. I have declared `i` as `final`, like `for(final int i=0; i<=30; i++)`. Then I had a different error. "Variable 'i' Can not be declared final"

Original source