Java android中每个textview的独立事件侦听器

Java android中每个textview的独立事件侦听器,java,android,event-handling,event-listener,Java,Android,Event Handling,Event Listener,我想将单独的事件侦听器添加到动态创建的textview列表中。到目前为止,代码如下所示: while (cur.moveToNext()){ TextView tv = new TextView(this); temp = cur.getString(cur.getColumnIndexOrThrow("_ID")); result = "some text"; tv.setText(result); tv.setOnClickListener(new V

我想将单独的事件侦听器添加到动态创建的textview列表中。到目前为止,代码如下所示:

while (cur.moveToNext()){
    TextView tv = new TextView(this);
    temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
    result = "some text";
    tv.setText(result);
    tv.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                myIntent.putExtra("id", temp);
                startActivity(myIntent);
            }
        });
    lOut.addView(tv);
}

但这是行不通的。单独的文本视图以列表的形式创建,但单独的事件侦听器不起作用

问题可能是您的
temp
变量。我假设它是一个成员变量?触发事件时,事件侦听器中的代码将使用
temp
的值,而不是定义
onClick()
函数时的值

在我脑海中,我能想到的最简单的解决方案是将
temp
对象存储为TextView的标记,然后在
onClick()
函数中检索它

while (cur.moveToNext()){
        TextView tv = new TextView(this);
        temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
        result = "some text";
        tv.setText(result);
        tv.setTag(temp);
        tv.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                    myIntent.putExtra("id", v.getTag());
                    startActivity(myIntent);
                }
            });
        lOut.addView(tv);
    }

假设这是实际代码而不是伪代码,那么我同意Aaron的观点,即使用成员字段可能是问题的根源。但是,我不同意这个解决方案:您不应该使用字段。(如果您必须将字段命名为“temp”,这是一个很好的提示,它应该是一个局部变量。)如果您创建一个“final”局部变量,那么您知道它不会从您的下面更改,并且该固定值将锁定到您的匿名子类(即侦听器)中

代码如下所示:

while (cur.moveToNext()){
    TextView tv = new TextView(this);
    final String temp = cur.getString(cur.getColumnIndexOrThrow("_ID"));
    final String result = "some text";
    tv.setText(result);
    tv.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent myIntent = new Intent(v.getContext(), newsDetails.class);
                myIntent.putExtra("id", temp);
                startActivity(myIntent);
            }
        });
    lOut.addView(tv);
}

当然,您希望去掉名为“temp”和“result”的字段,因为局部变量取代了它们。

是的,这种方法肯定更好。这就是我在周日早上尝试回答技术问题时得到的结果:)我的方法实际上可能与以前有相同的问题,因为您将存储指向同一成员变量的指针。