getView()方法,CheckBox和setOnClickListener()

时间:2017-08-13 15:20:12

标签: android listview checkbox

我几乎向所有人提出了这个问题并得到了同样的答案。

问题:我设计了一个自定义适配器,因为我的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;
}

1 个答案:

答案 0 :(得分:2)

View.OnClickListener是代码中的匿名内部类。在Java中,如果匿名类访问外部类中的任何变量,则在创建匿名类的实例时,这些值将通过自动生成的构造函数自动复制到匿名类中。

在您的代码中,OnClickListener正在访问pos整数。您正在将视图的position分配给整数pos,并且由于OnClickListener正在访问该整数,因此会将其复制到OnClickListener匿名类中。