我问了几乎所有人这个问题,得到了同样的答案。
问:我设计了一个自定义适配器,因为我的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匿名类中。

10-07 19:20
查看更多