java - 为什么我只能引用传递给 onClickListener 的 TextView 数组中的最后一个元素

标签 java android arrays loops view

我已经动态创建了一组 30 个 TextView,并试图在我单击它们时更改它们的背景颜色。它们显示为垂直对的列表,每对之间有空格。当我单击顶部的 TextView 时,我希望它变为绿色,紧靠其下方的变为红色,反之亦然。

我现在遇到的问题是,当我单击底部的 TextView 时,它只会设置最后一个 TextView,即 myTextViews[n-1]。当我点击顶部的 TextView 时,我得到一个 ArrayIndexOutOfBoundsException。

我会使用 setTag、getTag,但我不确定是否可以调用之前的标签。

public class MainActivity extends OtherActivity {
int i = null;

    final TextView[] myTextViews = new TextView[names.size()]; // create an empty array;

        for (i = 0; i < names.size(); i++) {
            // create a new TextView
            final TextView rowTextView = new TextView(this);

            // save a reference to the TextView for later
            myTextViews[i] = rowTextView;

            // set some properties of rowTextView
            rowTextView.setText(names.get(i));

            // Create onClickListeners for each choice
            if ((i+1)%3 != 0) {
                if (i%3 == 0) {
                    // Sets onClick rules for top choice
                    rowTextView.setOnClickListener(new  View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            rowTextView.setBackgroundColor(Color.GREEN);
                            myTextViews[i+1].setBackgroundColor(Color.GREEN);
                        }
                    });
                } else if ((i-1)%3 == 0) {
                     // Sets onClick rules for bottom choice
                     rowTextView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                             rowTextView.setBackgroundColor(Color.GREEN);
                             myTextViews[i-1].setBackgroundColor(Color.RED);
                        }
                     });
                }
            }
       }
}

最佳答案

正如我在评论中指出的那样,我对你的问题有点困惑。如果变量不是 final,则不能在 onClick 方法中使用索引,也不能使变量成为 final,因为那样它是所有的观点都一样。解决办法是这样的(没测试过,可能是漏括号或者错字)。

TextView[] myTextViews = new TextView[names.size()];
for (int i = 0; i < names.size(); i++) {
     myTextViews[i] = new TextView(this);
     myTextViews[i].setText(names.get(i));
}
for (int i = 0; i < names.size(); i++) {
    final TextView thisOne = myTextViews[i];
    if (i%3 == 0) {
        final TextView nextOne = myTextViews[i+1];
        thisOne.setOnClickListener(new View.onClickListener() {
            @Override
            public void onClick(View v) {
                thisOne.setBackgroundColor(Color.GREEN);
                nextOne.setBackgroundColor(Color.GREEN);
            }
        });
    } else if ((i-1)%3 == 0) {
        final TextView previousOne = myTextViews[i-1];
        thisOne.setOnClickListener(new View.onClickListener() {
            @Override
            public void onClick(View v) {
                thisOne.setBackgroundColor(Color.GREEN);
                previousOne.setBackgroundColor(Color.RED);
            }
        });
    }
}

关于java - 为什么我只能引用传递给 onClickListener 的 TextView 数组中的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32575571/

相关文章:

java - 位置服务 [访问] 启用监听器

android - 使用 TrafficeStats 和 NetworkStatsManager 的数据使用统计

android - ExpandableListView 上的向下滑动效果

java - Android AsyncTask 和对象传递

java - 如何将libgdx中的图像 Actor 旋转中点?

java - KeyListener 不工作的问题

java - 如何在 Tomcat 上安装 restcomm

c - 即使数组编号匹配,它仍然返回 false

javascript - Vue.js:延迟地一次输出一个元素的数组内容

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?