我作为我的第一个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 切换为 bUserGridbigSwitcher.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 并发生计算机镜头?
请你帮助我吗?
答案 0 :(得分:0)
您更新适配器的位置?您更改适配器的基础数据,还是更改适配器列表? 适配器也是UI的一部分,因此适配器本身的更改应仅在GUI线程中进行。我在一些其他项目中告诉我,因为我在服务线程中更改了适配器内容,因此我得到了一些UI异常(显示)。 最终,您必须重新创建适配器列表以反映基础数据的更改?