Изменить объект из неконечной переменной OnClickListener разрешено

У меня есть адаптер, куда я загружаю своих пользователей и одну кнопку / текстовый файл для отправки приглашений. В адаптере я делаю это:

    @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", Когда я прокручиваю вниз / вверх, текстовое представление и кнопка появляются в строке.

Любые идеи по изменению значения объекта UserAgenda ua в пределах onClicklistener?

Спасибо!

2 ответа

Решение

Объявляем ua final, потому что когда at ua.setInvited(true); вы изменяете значение в объекте, на который ссылается 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;
        }
  }

В Java ключевое слово final применительно к переменной ссылочного типа означает, что его ссылка не может измениться, а также что базовый объект не может быть изменен (последний называется неизменяемостью).

Например, это означает, что в вашем методе, если ua был объявлен как окончательный, вы можете сделать:

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

но нет

ua = new UA();
Другие вопросы по тегам