Диалог множественного выбора не позволяет мне изменять массив при нажатии - PullRequest
1 голос
/ 11 мая 2010

У меня есть диалог с несколькими вариантами действий. У меня есть логический массив, чтобы отслеживать, какие элементы выбраны в диалоговом окне. Поэтому я хочу, чтобы каждый раз, когда щелкали по элементу, делалось соответствующее место в моем массиве. Массив создается в onCreateDialog перед возвратом.

public Dialog onCreateDialog(int id) {
  userlistlocal=getuserlist(username);
  boolean[] usernamechecked=new boolean[userlistlocal.length/3];
  Arrays.fill(usernamechecked,false);         
  return new AlertDialog.Builder(Newevent.this)
        .setIcon(R.drawable.ic_menu_invite)
        .setTitle("Add People")
        .setMultiChoiceItems(userselectionlistlocal,
                null,new DialogInterface.OnMultiChoiceClickListener() {


                    public void onClick(DialogInterface dialog, int whichButton,
                            boolean isChecked) { 

                        /* User clicked on a check box do some stuff */
                     usernamechecked[whichButton]=isChecked;<-------HERE
                    }
                })
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {

                /* User clicked Yes so do some stuff */
            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {

                /* User clicked No so do some stuff */
            }
        })
       .create();

 }

Но когда я добавляю в метод onClick мой логический массив, он говорит, что он должен быть окончательным (невозможно ссылаться на неконечную переменную username, проверенную внутри внутреннего класса, определенного в другом методе). Я не знаю, что делать

Ответы [ 2 ]

0 голосов
/ 11 мая 2010

вы определили usernamechecked внутри метода onCreateDialog, он существует только внутри области действия этого метода. Вы должны определить его как член вашего класса деятельности или внутреннего класса. Поскольку его размер зависит от вызова getuserlist, который, как я полагаю, является методом вашего класса активности, я бы добавил его в качестве члена вашего класса активности, хотя это зависит от вас.

Определите usernamechecked как члена вашего класса активности как:

private boolean usernamechecked[];

Я бы тоже переехал

userlistlocal=getuserlist(username);
usernamechecked=new boolean[userlistlocal.length/3];
Arrays.fill(usernamechecked,false); 

к вашему методу onCreate (или другому методу инициализации), если это возможно, так как похоже, что он не имеет никакого отношения к созданию диалога, но это просто проблема стиля / удобства обслуживания.

0 голосов
/ 11 мая 2010

Вы не можете получить доступ к вашему массиву, если он не объявлен final. Но если он объявлен final, вы должны учитывать, что вы больше не можете его изменять.

Метод решения этой проблемы - определить OnMultiChoiceClickListener не как анонимный внутренний класс. Например, вы можете определить его как внутренний класс в том же классе или даже как отдельный класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...