Изменение объекта из неконечной переменной OnClickListener разрешено - PullRequest
2 голосов
/ 21 октября 2011

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

    @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 ]

5 голосов
/ 21 октября 2011

объявляет 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;
        }
  }
3 голосов
/ 21 октября 2011

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

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

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

, но не

ua = new UA();
...