很久以前我已經注意到這個問題,但只有現在我能夠準備演示,清楚地再現它。該問題在2.1仿真器和我的ICS 4.0.3設備上預先發布。損壞的ActionBar外觀
在應用程序中,我有AsyncTask,它可能會調整actionbar不確定進度的可見性,並通過調用invalidateOptionsMenu來重新啓動菜單。這應該隱藏刷新圖標。這是工作正常,直到我修改listView數據模型並在適配器上調用notifyDataSetChanged。在這樣的動作之後,Actionbar可能會破壞視圖。
預期的觀點:
破碎視圖(最後一項永遠消失或空白加入在某些情況下insted的的):
的引起的代碼是在onPostExecute
@Override
protected void onPostExecute(Void result)
{
super.onPostExecute(result);
for (int i = 0; i < 10; i++)
{
adapter.items.add(i);
}
adapter.notifyDataSetChanged();
activity.stopLoading();
}
...
void stopLoading()
{
if (loaders.decrementAndGet() == 0)
{
setSupportProgressBarIndeterminateVisibility(false);
invalidateOptionsMenu();
}
}
任何想法爲什麼會發生這種情況,並在大多數情況下,因爲更新列表視圖適配器(o或許有些視圖更新)?如果我刪除線adapter.notifyDataSetChanged();操作欄不會在演示中被破壞。但在實際應用中,可能被打破,因爲另一個原因也(不能準確確定所有問題的原因)
項目證明一個問題:http://goo.gl/ZbMTU
開業ActionBarSherlock問題:https://github.com/JakeWharton/ActionBarSherlock/issues/887
UPD: 繼續探討這個問題。似乎不完全adapter.notifyDataSetChanged()導致無效的樣子,而是由AdapterView.AdapterDataSetObserver的requestLayout呼叫時,監聽數據集在ListView改變事件
解決辦法存在,我可以打電話invalidateOptionsMenu和setSupportProgressBarIndeterminateVisibility在handler.post。但它強制甚至使用FragmentPagerAdapter的自定義實現,它在延遲的處理程序中調用fragment.setHasOptionsMenu.post
我想要的是找到最有效的方式來使視圖和操作欄無效而不會破壞它。
你應該叫supportIvalidateOptionsMenu()不InvalidateOptionsMenu() – Greensy 2013-05-13 09:54:42
它不是真正的原因,比如我不能到處控制它。例如在Fragment.setMenuVisible – httpdispatch 2013-05-13 11:00:19