Search code examples
javaandroidfor-loopfinal

Android Java: Using setOnClickListener in for loop


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"


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.