Как обновить GridView до того, как произойдет анимация ViewSwitcher?

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

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

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

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

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 ответ

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

Другие вопросы по тегам