Изменить объект из неконечной переменной 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();