从OnClickListener非最终变量permited修改对象

Day*_*man 2 java android anonymous-inner-class

我有一个适配器,我加载我的用户和一个按钮/ textfiled发送邀请.在适配器中我这样做:

    @Override
public View getView(int position, View convertView, ViewGroup parent) {                 
    UserAgenda ua = getItem(position);  

    ViewHolder holder;      
    if (convertView == null) {          
        //...         
        convertView.setTag(holder);            
    } else {
        holder = (ViewHolder) convertView.getTag();
    }           

        if(ua.getInvited() != null){
            if(ua.getInvited().equals("true")){
                addTextViewInvited(convertView);//add a textview as the user is invited
            }
            else if(ua.getInvited().equals("false")){
                addButton2Invite(convertView,ua);//add the button to invite
            }
        }       
    return convertView;
}
Run Code Online (Sandbox Code Playgroud)

在addButton2Invite的方法上,我发送邀请为:

   private void addButton2Invite(final View convertView, UserAgenda ua) {       

    bt2Invited.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(final View v) {

            final Button bt2Invited = (Button) convertView.findViewById(R.id.bt2invite);
            final ProgressBar pbar = (ProgressBar) convertView.findViewById(R.id.progress);
            new Thread(){
                @Override
                public void run() { 
                    if(networkWork())
                       ua.setInvited("true"); //Error, NOT PERMITED! ua need to be final.
                };
            }.start();
        }
    });     
}
Run Code Online (Sandbox Code Playgroud)

当网络工作没问题的时候,我想设置ua.setInvited("true");但是如果我没有声明ua那就不会被允许final.但后来我无法改变它的值,下次适配器进入getView就会找到它ua.getInvited() = "false".当我向下/向上滚动文本视图时,按钮出现在该行上.

任何改变UserAgenda对象的价值的想法都在onClicklistener

谢谢!

Uma*_*shi 5

声明ua final,因为在ua.setInvited(true)时; 你正在改变对象所引用的值ua而不是ua的引用因此通过设置ua final不会影响你的setInvited(true)

否则你必须通过在你的活动类中实现它来使用点击监听器

public MyActivity extends Activity implements OnClickListener
Run Code Online (Sandbox Code Playgroud)

和使用

myView.setOnClickListener(this);
Run Code Online (Sandbox Code Playgroud)

并实施的方法

public void onClick(View v)
 {
    switch (v.getId()) 
       {
         case R.id.myView:
          //functionality for on click
         break;
        }
  }
Run Code Online (Sandbox Code Playgroud)