0

作为我的第一个 Android 应用程序,我开发了 Battleships 游戏。

我决定使用一个拥有两个 GridView 的 ViewSwitcher。一个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);
  }
});

如果用户错过了,那么在 userAttack 的onPostExecute()部分中,我调用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();

然后在 userAttack 的onPostExecute ()部分,我启动 AsyncTask computerAttack。在computerAttack的onPreExecute()部分中,我通过调用将bComputerGrid切换到bUserGrid

bigSwitcher.showNext();

发生切换,但在此之前bComputerGrid尚未更新!

Computer通过调用bUserAdapter.notifyDataSetChanged()执行其罢工并成功刷新computerAttack的onProgressUpdate()部分中的用户字段。当计算机错过时,应用程序来等待用户再次点击(点击)。

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

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

    }

但是为什么在切换和计算机拍摄发生之前我不能刷新bComputerGrid呢?

请你帮助我好吗?

4

1 回答 1

0

您在哪里更新适配器?您更改了适配器的底层数据,还是更改了适配器列表?适配器也是 UI 的一部分,因此适配器本身的更改应该只发生在 GUI 线程中。当我在服务线程中更改适配器内容时,我在其他一些项目中收到了几个 UI 异常(显示)告诉我。最终您必须重新创建适配器列表以反映基础数据的变化?

于 2011-01-30T15:37:50.903 回答