如何在ViewSwitcher动画发生之前更新GridView?

时间:2011-01-30 14:46:36

标签: android gridview viewswitcher

我作为我的第一个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 在此之前尚未更新!

计算机通过调用 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 并发生计算机镜头?

请你帮助我吗?

1 个答案:

答案 0 :(得分:0)

您更新适配器的位置?您更改适配器的基础数据,还是更改适配器列表? 适配器也是UI的一部分,因此适配器本身的更改应仅在GUI线程中进行。我在一些其他项目中告诉我,因为我在服务线程中更改了适配器内容,因此我得到了一些UI异常(显示)。 最终,您必须重新创建适配器列表以反映基础数据的更改?