Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么我需要在baseAdapter的getView内部生成obj final?_Android_Baseadapter - Fatal编程技术网

Android 为什么我需要在baseAdapter的getView内部生成obj final?

Android 为什么我需要在baseAdapter的getView内部生成obj final?,android,baseadapter,Android,Baseadapter,我正在尝试扩展baseAdapter。并在onClick事件中获取对象。但是它说,obj需要被宣布为最终的。 有人告诉我在点击事件中找不到obj(aStudent)?如果是,为什么 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) adapterContext .ge

我正在尝试扩展baseAdapter。并在onClick事件中获取对象。但是它说,obj需要被宣布为最终的。 有人告诉我在点击事件中找不到obj(aStudent)?如果是,为什么

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) adapterContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater.inflate(R.layout.custome_adapter_list_row_item, parent, false);

    TextView lblStudentName = (TextView) rowView.findViewById(R.id.lblStudentName);
    TextView lblStudentAge = (TextView) rowView.findViewById(R.id.lblStudentAge);
    Button btnNext = (Button) rowView.findViewById(R.id.lbllist);

    **final  Student aStudent = studentDataHolder.get(position);**

    if (aStudent != null) {
        lblStudentName.setText(aStudent.getName());
        lblStudentAge.setText("Age : " + aStudent.getAge());

        btnNext.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(adapterContext, "Position is"+aStudent.getName(), Toast.LENGTH_LONG).show();
            }
        });



    }
    return rowView;

}

据我所知,每次从数组中获取一行时,代码都会生成一个新的Student对象。我错了吗?但同样,为什么是final?

您需要将其设置为final,因为您在一个匿名的内部类中使用它

下面的链接给出了更好的解释

引用

匿名类无法访问其封闭类中的局部变量 未声明为最终或有效最终的范围


您需要将其设置为最终版本,因为您正在一个匿名的内部类中使用它

下面的链接给出了更好的解释

引用

匿名类无法访问其封闭类中的局部变量 未声明为最终或有效最终的范围


您需要将其设置为最终版本,因为您正在一个匿名的内部类中使用它

下面的链接给出了更好的解释

引用

匿名类无法访问其封闭类中的局部变量 未声明为最终或有效最终的范围


您需要将其设置为最终版本,因为您正在一个匿名的内部类中使用它

下面的链接给出了更好的解释

引用

匿名类无法访问其封闭类中的局部变量 未声明为最终或有效最终的范围


我花了一些时间才明白,但我的理由如下。当您将一个变量声明为
final
时,您是在“告诉”编译器(除其他外),即使在局部作用域消失之后,该变量也应该是可用的,并且一旦实例化它就不能重新赋值。为了澄清,您将侦听器声明为一个内部类。按下
按钮时,侦听器将触发。
按钮
可能在
getView()
完成执行并从堆栈中删除后很长时间内被按下。这将导致问题,因为
aStudent
将不再位于内存中。通过将其声明为final,即使从堆栈中删除了该方法,
aStudent
也将被保留。

我花了一些时间才理解,但我的推理如下。当您将一个变量声明为
final
时,您是在“告诉”编译器(除其他外),即使在局部作用域消失之后,该变量也应该是可用的,并且一旦实例化它就不能重新赋值。为了澄清,您将侦听器声明为一个内部类。按下
按钮时,侦听器将触发。
按钮
可能在
getView()
完成执行并从堆栈中删除后很长时间内被按下。这将导致问题,因为
aStudent
将不再位于内存中。通过将其声明为final,即使从堆栈中删除了该方法,
aStudent
也将被保留。

我花了一些时间才理解,但我的推理如下。当您将一个变量声明为
final
时,您是在“告诉”编译器(除其他外),即使在局部作用域消失之后,该变量也应该是可用的,并且一旦实例化它就不能重新赋值。为了澄清,您将侦听器声明为一个内部类。按下
按钮时,侦听器将触发。
按钮
可能在
getView()
完成执行并从堆栈中删除后很长时间内被按下。这将导致问题,因为
aStudent
将不再位于内存中。通过将其声明为final,即使从堆栈中删除了该方法,
aStudent
也将被保留。

我花了一些时间才理解,但我的推理如下。当您将一个变量声明为
final
时,您是在“告诉”编译器(除其他外),即使在局部作用域消失之后,该变量也应该是可用的,并且一旦实例化它就不能重新赋值。为了澄清,您将侦听器声明为一个内部类。按下
按钮时,侦听器将触发。
按钮
可能在
getView()
完成执行并从堆栈中删除后很长时间内被按下。这将导致问题,因为
aStudent
将不再位于内存中。通过声明它为
final
aStudent
将被保留,即使该方法已从堆栈中删除。

非常感谢。看来我又要上匿名课了。非常感谢。看来我又要上匿名课了。非常感谢。看来我又要上匿名课了。非常感谢。看来我又要上匿名课了。