我问了几乎所有人这个问题,得到了同样的答案。
问:我设计了一个自定义适配器,因为我的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;
}
最佳答案
View.OnClickListener
是代码中的一个匿名内部类。在Java中,如果匿名类访问外部类中的任何变量,则在创建匿名类的实例时,这些值将通过自动生成的构造函数自动复制到匿名类中。
在您的代码中,OnClickListener
正在访问pos
整数。您正在将视图的position
分配给整数pos
,并且由于OnClickListener
正在访问该整数,因此它被复制到OnClickListener
匿名类中。