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