Заметил неприятное поведения у ActionbBar (ActionBarSherlock в частности). В приложении я использую FEATURE_INDETERMINATE_PROGRESS который показывается при выполнении некоторых действий. Также когда показывается прогресс должен прятаться action refresh. Чтобы спрятать его приходится вызывать invalidateOptionsMenu, который, в свою очередь, вызывает onPrepareOptionsMenu где я уже могу изменить видимость
Override
public void onPrepareOptionsMenu(Menu menu)
{
reinitMenu(menu);
super.onPrepareOptionsMenu(menu);
}
protected void reinitMenu(Menu menu)
{
menu.findItem(R.id.menu_refresh).setVisible(
!getFActivity().isLoading());
}
Когда загружаются данные через AsyncTask в методе onPostExecute вызывается последовательно notifyDataSetChanged у модели привязанной к ListView, setSupportProgressBarVisibility и invalidateOptionsMenu.
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();
}
}
Этот код во многих случаях «ломает» вид у ActionBar. Пропадают иконки, появляется пустое место справа вместо них
Ожидаемый вид:
На самом деле ActionBar «ломается» и вид получается такой (исчезает последняя иконка):
Тут, вообще, вместо трех иконок видно одну и пустое место справа
Если убрать вызов adapter.notifyDataSetChanged(); то ActionBar будет выглядеть правильно. Но подозреваю, что это не единственная возможная причина такой «поломки»,
Быть может кто-нибудь сталкивался с подобным и знает как правильно бороться с этой проблемой?
Ссылка на исходник проекта, демонстрирующего проблему
goo.gl/ZbMTU
Удалось воспроизвести на эмуляторе версии 2.1 и на устройстве с Android ICS 4.0.3 на борту.