-2

请帮我解决这个问题,我从来不明白 onClickListener 内部是如何工作的,所以:

有我自己的课:

public class ItemFrame extends LinearLayout{

     int item_id;

     public ItemFrame(Context context){
        super(context);
     }

     public int getItem_id() {
        return item_id;
     }

    public void setItem_id(int item_id) {
        this.item_id = item_id;
     }
}

我初始化一个并添加一个 onClickListener:

ItemFrame myItemFrame = new ItemFrame(this);

myItemFrame.setOnClickListener(new OnClickListener(){
                public void onClick(View v){

                                   //ERROR HERE:
                                   //Cannot refer to a non-final variable myItemFrame inside an inner class 
                                   //defined in a different method
                                   //Quick fix: Change modifier of 'myItemFrame' to final.
                    myItemFrame.setItemId(100);
                }


            });

所以...我的问题是:如何在 onClickListener 中设置我的班级的数据标签???如果我将它更改为 Eclipse 所说的 final ,我无法修改它,因为它是final。这有什么意义吗?

4

2 回答 2

1

您创建的 OnClickListener 是一个匿名内部类,只能引用最终值。

简单地改变:

ItemFrame myItemFrame = new ItemFrame(this);

成为:

final ItemFrame myItemFrame = new ItemFrame(this);

您仍然可以修改您创建的 ItemFrame 对象。您只是无法将新变量重新分配给 myItemFrame 变量。

于 2012-05-27T13:32:44.030 回答
1

还有另一种实现代码的方法,看看它。

public class ItemFrame extends LinearLayout implements OnClickListener
{
     int item_id;

     public ItemFrame(Context context)
     {
        super(context);
     }

     public int getItem_id() 
     {
        return item_id;
     }

    public void setItem_id(int item_id) 
    {
        this.item_id = item_id;
    }

    public void onClick(View v)
    {
       setItemId(100);
    }
}
于 2012-05-27T13:33:49.120 回答