2

我有一个适配器,用于加载我的用户和一个按钮/文本文件用于发送邀请。在适配器中,我这样做:

    @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;
}

在 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();
        }
    });     
}

当 networkWork 正常时,我想设置,ua.setInvited("true");但如果我不将 ua 声明为final. 但是我不能改变它的值,下次适配器进入 getView 时会发现ua.getInvited() = "false". 当我向下/向上滚动时,文本视图和按钮出现在行上。

有什么想法可以更改 ua 中的对象 UserAgenda ua 的值onClicklistener吗?

谢谢!

4

2 回答 2

5

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

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

public MyActivity extends Activity implements OnClickListener

并使用

myView.setOnClickListener(this);

并实现方法

public void onClick(View v)
 {
    switch (v.getId()) 
       {
         case R.id.myView:
          //functionality for on click
         break;
        }
  }
于 2011-10-21T13:11:48.583 回答
3

在 Java 中,关键字final应用于引用类型的变量时,意味着它的引用不能改变,而不是底层对象不能修改(后者称为不变性)。

例如,这意味着在你的方法中,如果ua被声明为 final,你可以这样做:

ua.some_pub_non_final_field = "some_value";
ua.somePublicMethod();

但不是

ua = new UA();
于 2011-10-21T13:16:40.713 回答