很久以前我已经注意到这个问题,但只有现在我能够准备演示,清楚地再现它。该问题在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