2013-04-10 59 views
6

很久以前我已经注意到这个问题,但只有现在我能够准备演示,清楚地再现它。该问题在2.1仿真器和我的ICS 4.0.3设备上预先发布。损坏的ActionBar外观

在应用程序中,我有AsyncTask,它可能会调整actionbar不确定进度的可见性,并通过调用invalidateOptionsMenu来重新启动菜单。这应该隐藏刷新图标。这是工作正常,直到我修改listView数据模型并在适配器上调用notifyDataSetChanged。在这样的动作之后,Actionbar可能会破坏视图。

预期的观点: image

破碎视图(最后一项永远消失或空白加入在某些情况下insted的的): image image

的引起的代码是在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

我想要的是找到最有效的方式来使视图和操作栏无效而不会破坏它。

+0

你应该叫supportIvalidateOptionsMenu()不InvalidateOptionsMenu() – Greensy 2013-05-13 09:54:42

+0

它不是真正的原因,比如我不能到处控制它。例如在Fragment.setMenuVisible – httpdispatch 2013-05-13 11:00:19

回答

0

我不明白你为什么在doInBackground这样做:

了Thread.sleep(randomSleep);

但是,在类“LoadingTask”中,注释“doInBackground”中的行将解决问题。

看到:

 @Override 
     protected Void doInBackground(Void... params) 
     { 
//   int randomSleep = (int) (Math.random() * 1000); 
//   try 
//   { 
//    Thread.sleep(randomSleep); 
//   } catch (InterruptedException e) 
//   { 
//    // TODO Auto-generated catch block 
//    e.printStackTrace(); 
//   } 
      return null; 
     } 
+0

doInBackground是用于模拟真实工作。通常它可能是一些网络相关的操作,需要一些时间。 – httpdispatch 2013-05-16 06:45:34