Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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"

like image 963
Deget The Avatar asked Mar 16 '26 04:03

Deget The


1 Answers

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.

like image 112
Y.S Avatar answered Mar 18 '26 16:03

Y.S



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!