Как обновить GridView до того, как произойдет анимация ViewSwitcher? - PullRequest
0 голосов
/ 30 января 2011

Я работаю над игрой Battleships в качестве моего первого приложения для Android.

Я решил использовать ViewSwitcher, который содержит два GridView.Один bUserGrid предназначен для поля «Пользователь» (размещение пользовательских судов), bComputerGrid - для поля «Компьютер» (показаны пользовательские снимки).

GridView bComputerGrid, bUserGrid, mComputerGrid, mUserGrid;
ViewSwitcher bigSwitcher, miniSwitcher;

Пользователь наносит удар (нажимает на поле компьютера). Приложение запускает AsyncTask userAttack , который определяет, был ли этот удар успешным или нет.

bComputerGrid.setOnItemClickListener(new OnItemClickListener() {
  public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    runUserAttack(position);
  }
});

Если пользовательпропустил, затем в onPostExecute () секции userAttack я вызываю notifyDataSetChanged () , чтобы обновить bComputerGrid .

    protected void onPostExecute(String message) {
        ...
        bComputerAdapter.notifyDataSetChanged();
        mComputerAdapter.notifyDataSetChanged();
        firstmateMsg.setText(message);
        mUserBundle = mUserAttack.getmUBundle();
        mUserAttack=null;
        if (isCancelled()) return;
        if (mUserBundle.getBoolean("userMissed")) {
            mComputerAttack = new computerAttack();
            mComputerAttack.execute(mComputerBundle);
        } else {
            if (doesWon(seqComputerShips)) {
                showDialog(0);
            }
        }
    }

Но этого не происходит!Следующее утверждение не обновляет bComputerGrid , если пользователь пропустит.

bComputerAdapter.notifyDataSetChanged();

Затем здесь в onPostExecute () секции userAttack Я запускаюAsyncTask computerAttack onPreExecute () секции computerAttack Я переключаю bComputerGrid на bUserGrid , вызывая

bigSwitcher.showNext();

Переключение происходит, но bComputerGrid до этого не обновлялся!

Компьютер наносит удар и успешно обновляет поле пользователя в onProgressUpdate () секции computerAttack вызывая bUserAdapter.notifyDataSetChanged () .Когда компьютер пропустил, приложение снова ждет, когда пользователь ударит (нажмите).

    protected void onProgressUpdate(String... messages) {
        ...
        mUserAdapter.notifyDataSetChanged();
        bUserAdapter.notifyDataSetChanged();

    }
    protected void onPostExecute(Boolean result) {
        mComputerBundle = mComputerAttack.getmCBundle();
        mComputerAttack=null;
        if (field_switch) {
            switchViews();
        }

    }

Но почему я не могу обновить bComputerGrid до того, как произойдет переключение и выстрел компьютера?

Не могли бы вы мне помочь?

1 Ответ

0 голосов
/ 30 января 2011

Где вы обновляете свои адаптеры?Вы меняете базовые данные адаптера или меняете список адаптеров?Адаптеры также являются частью пользовательского интерфейса, поэтому изменения самого адаптера должны происходить только в потоке графического интерфейса.Я получил пару исключений пользовательского интерфейса (на дисплее), рассказывающих мне об этом в каком-то другом проекте, когда я менял содержимое адаптера в служебной ветке.В конце концов вам придется заново создать список адаптеров, чтобы отразить изменения в базовых данных?

...