我几乎向所有人提出了这个问题并得到了同样的答案。
问题:我设计了一个自定义适配器,因为我的ListView行有一个复选框和一个TextView。 getView()方法有一个setOnClickListener()方法,当我单击应用程序上的复选框时,是用setOnClickListener()调用getView()方法还是只执行setOnClickListener()?
答案:只执行setOnClickListener()。
新问题:如果是这样,当单击ListView第三行中的复选框时,pos
变量如何设置为2(它必须是2,因为第三行的索引是2但是指定了2进入pos
)?
public View getView( int position, View convertView, ViewGroup parent ){
View rowView = myInflater.inflate( R.layout.model_row, null );
final int pos = position;
TextView textView = (TextView) rowView.findViewById( R.id.text );
final CheckBox checkBox = (CheckBox) rowView.findViewById( R.id.checkbox );
textView.setText( myList.get(position).getContent() );
checkBox.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
if( checkBox.isChecked() ){
myList.get( pos ).setChecking( checkControl.Checked );
}
else{
myList.get( pos ).setChecking( checkControl.NonChecked );
}
}
});
return rowView;
}
答案 0 :(得分:2)
View.OnClickListener
是代码中的匿名内部类。在Java中,如果匿名类访问外部类中的任何变量,则在创建匿名类的实例时,这些值将通过自动生成的构造函数自动复制到匿名类中。
在您的代码中,OnClickListener
正在访问pos
整数。您正在将视图的position
分配给整数pos
,并且由于OnClickListener
正在访问该整数,因此会将其复制到OnClickListener
匿名类中。