2013-04-10 42 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