打开/关闭NavDrawer与invalidateOptionsMenu()上搜索查看和onQueryTextChange原因OnRestore中的呼叫被称为以及被称为、原因、invalidateOp

2023-09-12 02:19:33 作者:晚风千千

我有一个回调的实现MainActivity的:

DrawerListFragment.Callback ItemListFragment.Callbacks SearchView.OnQueryTextListener

我还添加了一个动作条搜索查看,并最终实现OnQueryTextListener改变listFragment每KB类型的ListView控件,但这个作品!此外,点击navDrawer项目生成一个新的/替换FragmentList交易的新型itemsList的。

现在的问题。 在动作条搜索查看实际筛选产生的电流ITEMLIST。

打开/关闭NavDrawer是用经典的新ActionBarDrawerToggle(){...}的实施与invalidateOptionsMenu()的重写方法。但这种呼吁火灾onQueryTextChange执行每次抽屉被打开/关闭...查看日志! 我故意产生一个异常,看看后面这些调用堆栈跟踪:OnRestore中实际上是调用了搜索查看,我的问题是,为什么,以及如何避免这种自动触发的搜索查看

我可以检查里面onQueryTextChange如果抽屉被打开,以避免itemsList的再生。这可能是一个解决方案,但我想知道你的想法,如果另一种解决方案存在。

如果不清楚我可以上传一些codeS。 日志的位置:

开机就显示No option to boot to

应用程序显示了所有项目的开始(抽屉位置0)。

  10-30 14:34:47.871:V / com.dav.pc.ui.MainActivity(900):所谓MainActivity.initializeDrawer!
10-30 14:34:47.880:D / com.dav.pc.ui.DrawerListFragment(900):新的抽屉实例!
10-30 14:34:47.900:D / com.dav.pc.ui.MainActivity(900):MainActivity.initializeActivity NewLaunch =合奏GLI ELEMENTI
10-30 14:34:47.920:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected列表中选择:ALL
10-30 14:34:47.920:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected事务提交
10-30 14:34:47.920:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected标签选择:全部
10-30 14:34:47.930:V / com.dav.pc.ui.DrawerListFragment(900):DrawerListFragment.onCreate()呼吁!
10-30 14:34:47.930:D / com.dav.pc.ui.DrawerListFragment(900):SETPOSITION的onCreate activated_position = -1
10-30 14:34:47.980:V / com.dav.pc.ui.DrawerListFragment(900):DrawerListFragment.onViewCreated()呼吁!
10-30 14:34:47.980:D / com.dav.pc.ui.DrawerListFragment(900):activated_position = 0
10-30 14:34:47.980:V / com.dav.pc.ui.DrawerListFragment(900):DrawerListFragment.setSelection()呼吁!
10-30 14:34:47.980:D / com.dav.pc.ui.DrawerListFragment(900):CurrentPosition = 0
10-30 14:34:47.980:V / com.dav.pc.ui.DrawerListFragment(900):DrawerListFragment.onActivityCreated()呼吁!
10-30 14:34:47.990:D / com.dav.pc.ui.ItemListFragment(900):ItemListFragment.onCreate包存在
10-30 14:34:47.990:D / com.dav.pc.ui.ItemListFragment(900):捆绑[{list_id = ALL}]
10-30 14:34:47.990:D / com.dav.pc.ui.ItemListFragment(900):创建列表中的所有(16个项目)
10-30 14:34:48.001:我/的System.out(900):[mFirstLetters>项目0,0]
10-30 14:34:48.001:我/的System.out(900):[mFirstLetters>项目1,1]
10-30 14:34:48.001:我/的System.out(900):[mFirstLetters>项目10.2]
10-30 14:34:48.001:我/的System.out(900):[mFirstLetters>项目11.3]
10-30 14:34:48.010:我/的System.out(900):[mFirstLetters>项目12.4]
10-30 14:34:48.010:我/的System.out(900):[mFirstLetters>项目13.5]
10-30 14:34:48.010:我/的System.out(900):[mFirstLetters>项目14.6]
10-30 14:34:48.020:我/的System.out(900):[mFirstLetters>项目15.7]
10-30 14:34:48.020:我/的System.out(900):[mFirstLetters>项目2,8]
10-30 14:34:48.020:我/的System.out(900):[mFirstLetters>项目3,9]
10-30 14:34:48.030:我/的System.out(900):[mFirstLetters>项目4,10]
10-30 14:34:48.040:我/的System.out(900):[mFirstLetters>项目5,11]
10-30 14:34:48.040:我/的System.out(900):[mFirstLetters>项目6,12]
10-30 14:34:48.051:我/的System.out(900):[mFirstLetters>项目7,13]
10-30 14:34:48.051:我/的System.out(900):[mFirstLetters>项目8,14]
10-30 14:34:48.051:我/的System.out(900):[mFirstLetters>项目9,15]
10-30 14:34:48.090:V / com.dav.pc.ui.MainActivity(900):onPostCreate叫!
10-30 14:34:48.101:V / com.dav.pc.ui.ItemListFragment(900):ItemListFragment.onResume()呼吁!
10-30 14:34:48.710:V / com.dav.pc.ui.MainActivity(900):MainActivity.onCreateOptionsMenu叫!
我键入0搜索查看:
10月30号14:34:55.421:V / com.dav.pc.ui.MainActivity(900):MainActivity.onQueryTextChange()newText:0
10-30 14:34:55.440:我/的System.out(900):[mFirstLetters>项目0,0]
10-30 14:34:55.440:我/的System.out(900):[mFirstLetters>项目10,1]
这又是一个奇怪的现象:getItemId在ItemListAdapter被称为5次......永远,为什么呢?
10-30 14:34:55.470:D / com.dav.pc.ui.ItemListAdapter(900):getItemId位置:0
10-30 14:34:55.470:D / com.dav.pc.ui.ItemListAdapter(900):getItemId位置:0
10-30 14:34:55.490:D / com.dav.pc.ui.ItemListAdapter(900):getItemId位置:0
10-30 14:34:55.490:D / com.dav.pc.ui.ItemListAdapter(900):getItemId位置:0
10-30 14:34:55.540:D / com.dav.pc.ui.ItemListAdapter(900):getItemId位置:0
10月30号14:35:01.940:V / com.dav.pc.ui.MainActivity(900):MainActivity.onCreateOptionsMenu称为!
onQueryTextChange被激发。
在这里,我控制的异常,当抽屉被打开方法触发!
此方法创建一个新的ItemListAdapter并传递到mItemListFragment:
10月30号14:35:02.080:V / com.dav.pc.ui.MainActivity(900):MainActivity.onQueryTextChange()newText:0
10-30 14:35:02.090:我/的System.out(900):[mFirstLetters>项目0,0]
10-30 14:35:02.100:我/的System.out(900):[mFirstLetters>项目10,1]
10月30号14:35:01.980:W / System.err的(900):在com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10月30号14:35:01.990:W / System.err的(900):在android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:35:01.990:W / System.err的(900):在android.widget.SearchView.access $ 1900年(SearchView.java:90)
10月30号14:35:01.990:W / System.err的(900):在android.widget.SearchView $ 10.onTextChanged(SearchView.java:1536)
10月30号14:35:01.990:W / System.err的(900):在android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10月30号14:35:01.990:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3259)
10月30号14:35:02.000:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3110)
10月30号14:35:02.000:W / System.err的(900):在android.widget.EditText.setText(EditText.java:78)
10月30号14:35:02.000:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3085)
10月30号14:35:02.000:W / System.err的(900):在android.widget.TextView.onRestoreInstanceState(TextView.java:2985)
10月30号14:35:02.000:W / System.err的(900):在android.view.View.dispatchRestoreInstanceState(View.java:9876)
10月30号14:35:02.010:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:02.010:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:02.010:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:02.010:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:02.020:W / System.err的(900):在android.view.View.restoreHierarchyState(View.java:9854)
10月30号14:35:02.020:W / System.err的(900):在com.android.internal.view.menu.MenuBuilder.restoreActionViewStates(MenuBuilder.java:358)
10-30 14:35:02.020:W / System.err的(900):在com.android.internal.policy.impl.PhoneWindow preparePanel(PhoneWindow.java:412)
10月30号14:35:02.020:W / System.err的(900):在com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739)
10月30号14:35:02.030:W / System.err的(900):在android.app.Activity.invalidateOptionsMenu(Activity.java:2552)
10月30号14:35:02.030:W / System.err的(900):在com.dav.pc.ui.MainActivity $ 1.onDrawerOpened(MainActivity.java:187)
10月30号14:35:02.030:W / System.err的(900):在android.support.v4.widget.DrawerLayout.dispatchOnDrawerOpened(DrawerLayout.java:488)
10月30号14:35:02.040:W / System.err的(900):在android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:459)
10月30号14:35:02.040:W / System.err的(900):在android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:1355)
...
10月30号14:35:42.040:V / com.dav.pc.ui.MainActivity(900):MainActivity.onCreateOptionsMenu称为!
这是我控制的例外,当抽屉被关闭的方法触发。
再次该方法的执行。
10月30号14:35:42.170:V / com.dav.pc.ui.MainActivity(900):MainActivity.onQueryTextChange()newText:0
10-30 14:35:42.170:我/的System.out(900):[mFirstLetters>项目0,0]
10-30 14:35:42.180:我/的System.out(900):[mFirstLetters>项目10,1]
10月30号14:35:42.080:W / System.err的(900):在com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10月30号14:35:42.080:W / System.err的(900):在android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:35:42.090:W / System.err的(900):在android.widget.SearchView.access $ 1900年(SearchView.java:90)
10月30号14:35:42.090:W / System.err的(900):在android.widget.SearchView $ 10.onTextChanged(SearchView.java:1536)
10月30号14:35:42.090:W / System.err的(900):在android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10月30号14:35:42.090:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3259)
10月30号14:35:42.090:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3110)
10月30号14:35:42.090:W / System.err的(900):在android.widget.EditText.setText(EditText.java:78)
10月30号14:35:42.100:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3085)
10月30号14:35:42.100:W / System.err的(900):在android.widget.TextView.onRestoreInstanceState(TextView.java:2985)
10月30号14:35:42.100:W / System.err的(900):在android.view.View.dispatchRestoreInstanceState(View.java:9876)
10月30号14:35:42.110:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:42.110:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:42.110:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:42.110:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:35:42.120:W / System.err的(900):在android.view.View.restoreHierarchyState(View.java:9854)
10月30号14:35:42.120:W / System.err的(900):在com.android.internal.view.menu.MenuBuilder.restoreActionViewStates(MenuBuilder.java:358)
10-30 14:35:42.120:W / System.err的(900):在com.android.internal.policy.impl.PhoneWindow preparePanel(PhoneWindow.java:412)
10月30号14:35:42.120:W / System.err的(900):在com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739)
10月30号14:35:42.130:W / System.err的(900):在android.app.Activity.invalidateOptionsMenu(Activity.java:2552)
10月30号14:35:42.130:W / System.err的(900):在com.dav.pc.ui.MainActivity $ 1.onDrawerClosed(MainActivity.java:180)
10月30号14:35:42.140:W / System.err的(900):在android.support.v4.widget.DrawerLayout.dispatchOnDrawerClosed(DrawerLayout.java:477)
10月30号14:35:42.140:W / System.err的(900):在android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:457)
10月30号14:35:42.140:W / System.err的(900):在android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:1355)
....

================================================== =======================
这时候,而不是我选择一个新的ItemDrawer生成新列表片段的交易:
10-30 14:37:47.961:D / com.dav.pc.ui.DrawerListAdapter(900):getItemId位置:5
10-30 14:37:48.100:D / com.dav.pc.ui.DrawerListAdapter(900):getItemId位置:5
10-30 14:37:48.100:D / com.dav.pc.ui.DrawerListAdapter(900):getItemId位置:0
10-30 14:37:48.100:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected ListId选择:4
10月30号14:37:48.100:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected ClearSearch
10月30号14:37:48.161:V / com.dav.pc.ui.MainActivity(900):MainActivity.onQueryTextChange()newText:
(清除searchText什么时候应该避免这种无用的一代)
10-30 14:37:48.170:我/的System.out(900):[mFirstLetters>项目0,0]
10月30号14:37:48.170的:I / System.out的(900):[mFirstLetters>项目1,1]
10-30 14:37:48.170:我/的System.out(900):[mFirstLetters>项目10.2]
10-30 14:37:48.170:我/的System.out(900):[mFirstLetters>项目11.3]
10-30 14:37:48.170:我/的System.out(900):[mFirstLetters>项目12.4]
10-30 14:37:48.181:我/的System.out(900):[mFirstLetters>项目13.5]
10-30 14:37:48.181:我/的System.out(900):[mFirstLetters>项目14.6]
10-30 14:37:48.181:我/的System.out(900):[mFirstLetters>项目15.7]
10-30 14:37:48.181:我/的System.out(900):[mFirstLetters>项目2,8]
10-30 14:37:48.181:我/的System.out(900):[mFirstLetters>项目3,9]
10-30 14:37:48.191:我/的System.out(900):[mFirstLetters>项目4,10]
10-30 14:37:48.191:我/的System.out(900):[mFirstLetters>项目5,11]
10-30 14:37:48.191:我/的System.out(900):[mFirstLetters>项目6,12]
10-30 14:37:48.191:我/的System.out(900):[mFirstLetters>项目7,13]
10-30 14:37:48.191:我/的System.out(900):[mFirstLetters>项目8,14]
10-30 14:37:48.191:我/的System.out(900):[mFirstLetters>项目9,15]
我再次受控例外看堆栈跟踪:
10月30号14:37:48.111:W / System.err的(900):在com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10月30号14:37:48.111:W / System.err的(900):在android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:37:48.111:W / System.err的(900):在android.widget.SearchView.access $ 1900年(SearchView.java:90)
10月30号14:37:48.121:W / System.err的(900):在android.widget.SearchView $ 10.onTextChanged(SearchView.java:1536)
10月30号14:37:48.121:W / System.err的(900):在android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10月30号14:37:48.121:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3259)
10月30号14:37:48.121:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3110)
10月30号14:37:48.121:W / System.err的(900):在android.widget.EditText.setText(EditText.java:78)
10月30号14:37:48.121:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3085)
10月30号14:37:48.131:W / System.err的(900):在android.widget.SearchView.setQuery(SearchView.java:481)
10月30号14:37:48.131:W / System.err的(900):在com.dav.pc.ui.MainActivity.onDrawerItemSelected(MainActivity.java:210)
10月30号14:37:48.131:W / System.err的(900):在com.dav.pc.ui.DrawerListFragment.onListItemClick(DrawerListFragment.java:153)
10月30号14:37:48.131:W / System.err的(900):在android.app.ListFragment $ 2.onItemClick(ListFragment.java:160)
...
10-30 14:37:48.201:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected事务提交
10-30 14:37:48.201:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected标签选择:4
10月30号14:37:48.201:D / com.dav.pc.ui.MainActivity(900):MainActivity.onDrawerItemSelected ClosingDrawer
10月30号14:37:48.201:V / com.dav.pc.ui.DrawerListFragment(900):DrawerListFragment.setSelection()称为!
10月30号14:37:48.211:D / com.dav.pc.ui.DrawerListFragment(900):CurrentPosition = 5
10-30 14:37:48.211:D / com.dav.pc.ui.DrawerListAdapter(900):getItemId位置:0
10-30 14:37:48.211:D / com.dav.pc.ui.DrawerListAdapter(900):getItemId位置:5
10月30号14:37:48.411:V / com.dav.pc.ui.ItemListFragment(900):ItemListFragment.onPause()称为!
10-30 14:37:48.431:D / com.dav.pc.ui.ItemListFragment(900):ItemListFragment.onCreate包存在
10-30 14:37:48.431:D / com.dav.pc.ui.ItemListFragment(900):捆绑[{list_id = 4}]
10-30 14:37:48.431:D / com.dav.pc.ui.ItemListFragment(900):创建列表4
(该表4中包含6个项目,我们在的onCreate)
10-30 14:37:48.431:我/的System.out(900):[mFirstLetters>项目0,0]
10月30号14:37:48.431的:I / System.out的(900):[mFirstLetters>项目1,1]
10月30号14:37:48.431的:I / System.out的(900):[mFirstLetters>项目2,2]
10月30号14:37:48.441的:I / System.out的(900):[mFirstLetters>项目3,3]
10月30号14:37:48.441的:I / System.out的(900):[mFirstLetters>项目4,4]
10月30号14:37:48.441的:I / System.out的(900):[mFirstLetters>项目5,5]
10月30号14:37:48.461:V / com.dav.pc.ui.ItemListFragment(900):ItemListFragment.onResume()称为!
10月30号14:37:48.721:V / com.dav.pc.ui.MainActivity(900):MainActivity.onCreateOptionsMenu称为!
10月30号14:37:48.811:V / com.dav.pc.ui.MainActivity(900):MainActivity.onQueryTextChange()newText:
10-30 14:37:48.811:我/的System.out(900):[mFirstLetters>项目0,0]
10月30号14:37:48.811的:I / System.out的(900):[mFirstLetters>项目1,1]
10月30号14:37:48.821的:I / System.out的(900):[mFirstLetters>项目2,2]
10月30号14:37:48.821的:I / System.out的(900):[mFirstLetters>项目3,3]
10月30号14:37:48.821的:I / System.out的(900):[mFirstLetters>项目4,4]
10月30号14:37:48.821的:I / System.out的(900):[mFirstLetters>项目5,5]
10月30号14:37:48.761:W / System.err的(900):在com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10月30号14:37:48.761:W / System.err的(900):在android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:37:48.761:W / System.err的(900):在android.widget.SearchView.access $ 1900年(SearchView.java:90)
10月30号14:37:48.761:W / System.err的(900):在android.widget.SearchView $ 10.onTextChanged(SearchView.java:1536)
10月30号14:37:48.761:W / System.err的(900):在android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10月30号14:37:48.761:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3259)
10月30号14:37:48.761:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3110)
10月30号14:37:48.771:W / System.err的(900):在android.widget.EditText.setText(EditText.java:78)
10月30号14:37:48.771:W / System.err的(900):在android.widget.TextView.setText(TextView.java:3085)
10月30号14:37:48.771:W / System.err的(900):在android.widget.TextView.onRestoreInstanceState(TextView.java:2985)
10月30号14:37:48.771:W / System.err的(900):在android.view.View.dispatchRestoreInstanceState(View.java:9876)
10月30号14:37:48.771:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:37:48.771:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:37:48.781:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:37:48.781:W / System.err的(900):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10月30号14:37:48.781:W / System.err的(900):在android.view.View.restoreHierarchyState(View.java:9854)
10月30号14:37:48.781:W / System.err的(900):在com.android.internal.view.menu.MenuBuilder.restoreActionViewStates(MenuBuilder.java:358)
10-30 14:37:48.781:W / System.err的(900):在com.android.internal.policy.impl.PhoneWindow preparePanel(PhoneWindow.java:412)
10月30号14:37:48.781:W / System.err的(900):在com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739)
10月30号14:37:48.791:W / System.err的(900):在android.app.Activity.invalidateOptionsMenu(Activity.java:2552)
10月30号14:37:48.791:W / System.err的(900):在com.dav.pc.ui.MainActivity $ 1.onDrawerClosed(MainActivity.java:180)
...
 

解决方案

我刚刚发现,工作对我来说很干净的一个新的解决方案,也许别人有兴趣:

在上prepareOptionsMenu(mMenu)的开/关实施抽屉我直接打电话 而不是 invalidateOptionsMenu()

正如你看到的,我使用保存在mMenu在其创建菜单的实例。调用此方法我避免了搜索查看无效,仍然可能包含一些文本,因此不被清除。

下面的另一个绝招(总是在在prepareOptionsMenu )来清除/图标化搜索查看我检查,如果目前是searchText是$ P $在我的服务类pviously设置

 如果(!Service.getInstance()。hasSearchText()){
    Log.d(MainActivity.class.getSimpleName(),关于prepareOptionsMenu清除搜索查看!);
    搜索查看搜索查看=(搜索查看)menu.findItem(R.id.action_search).getActionView();
    sea​​rchView.setIconified(真); //这也将清除搜索查看插件的文本
}
 

I have a MainActivity with callbacks implementation of:

DrawerListFragment.Callback ItemListFragment.Callbacks SearchView.OnQueryTextListener

I have also added an ActionBar SearchView, and finally implemented OnQueryTextListener to change the listView of the listFragment at each kb type, but this works! Also, clicking an item on navDrawer generates a new/replace FragmentList transaction for the new type of itemsList.

Now the problem. The ActionBar SearchView actually filters the current itemList created.

Opening/closing NavDrawer is made with the classic "new ActionBarDrawerToggle(){...}" implementation with invalidateOptionsMenu() in the override methods. But this calling fires onQueryTextChange execution everytime the drawer is opened/closed... See logs! I've purposely generate an exception to see the stacktrace behind these calls: onRestore is actually called for the SearchView, my question is why and how to avoid this automatic trigger for the SearchView?

I may check inside onQueryTextChange if the drawer is opened to avoid the regeneration of the itemsList. This could be a solution, but I would like to know what you think and if another solution exists.

If not clear I may upload some codes. Logs are here:

Apps shows ALL items at start (Drawer position 0).

10-30 14:34:47.871: V/com.dav.pc.ui.MainActivity(900): MainActivity.initializeDrawer called!
10-30 14:34:47.880: D/com.dav.pc.ui.DrawerListFragment(900): New Drawer Instance!
10-30 14:34:47.900: D/com.dav.pc.ui.MainActivity(900): MainActivity.initializeActivity NewLaunch=Tutti gli elementi
10-30 14:34:47.920: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected List selected: ALL
10-30 14:34:47.920: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected Transaction Commit
10-30 14:34:47.920: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected Label selected: ALL
10-30 14:34:47.930: V/com.dav.pc.ui.DrawerListFragment(900): DrawerListFragment.onCreate() called!
10-30 14:34:47.930: D/com.dav.pc.ui.DrawerListFragment(900): SetPosition onCreate activated_position=-1
10-30 14:34:47.980: V/com.dav.pc.ui.DrawerListFragment(900): DrawerListFragment.onViewCreated() called!
10-30 14:34:47.980: D/com.dav.pc.ui.DrawerListFragment(900): activated_position=0
10-30 14:34:47.980: V/com.dav.pc.ui.DrawerListFragment(900): DrawerListFragment.setSelection() called!
10-30 14:34:47.980: D/com.dav.pc.ui.DrawerListFragment(900): CurrentPosition=0
10-30 14:34:47.980: V/com.dav.pc.ui.DrawerListFragment(900): DrawerListFragment.onActivityCreated() called!
10-30 14:34:47.990: D/com.dav.pc.ui.ItemListFragment(900): ItemListFragment.onCreate Bundle exists
10-30 14:34:47.990: D/com.dav.pc.ui.ItemListFragment(900): Bundle[{list_id=ALL}]
10-30 14:34:47.990: D/com.dav.pc.ui.ItemListFragment(900): Create List ALL (16 items)
10-30 14:34:48.001: I/System.out(900): [mFirstLetters>Item 0,0]
10-30 14:34:48.001: I/System.out(900): [mFirstLetters>Item 1,1]
10-30 14:34:48.001: I/System.out(900): [mFirstLetters>Item 10,2]
10-30 14:34:48.001: I/System.out(900): [mFirstLetters>Item 11,3]
10-30 14:34:48.010: I/System.out(900): [mFirstLetters>Item 12,4]
10-30 14:34:48.010: I/System.out(900): [mFirstLetters>Item 13,5]
10-30 14:34:48.010: I/System.out(900): [mFirstLetters>Item 14,6]
10-30 14:34:48.020: I/System.out(900): [mFirstLetters>Item 15,7]
10-30 14:34:48.020: I/System.out(900): [mFirstLetters>Item 2,8]
10-30 14:34:48.020: I/System.out(900): [mFirstLetters>Item 3,9]
10-30 14:34:48.030: I/System.out(900): [mFirstLetters>Item 4,10]
10-30 14:34:48.040: I/System.out(900): [mFirstLetters>Item 5,11]
10-30 14:34:48.040: I/System.out(900): [mFirstLetters>Item 6,12]
10-30 14:34:48.051: I/System.out(900): [mFirstLetters>Item 7,13]
10-30 14:34:48.051: I/System.out(900): [mFirstLetters>Item 8,14]
10-30 14:34:48.051: I/System.out(900): [mFirstLetters>Item 9,15]
10-30 14:34:48.090: V/com.dav.pc.ui.MainActivity(900): onPostCreate called!
10-30 14:34:48.101: V/com.dav.pc.ui.ItemListFragment(900): ItemListFragment.onResume() called!
10-30 14:34:48.710: V/com.dav.pc.ui.MainActivity(900): MainActivity.onCreateOptionsMenu called!
I type 0 in the searchView:
10-30 14:34:55.421: V/com.dav.pc.ui.MainActivity(900): MainActivity.onQueryTextChange() newText: 0
10-30 14:34:55.440: I/System.out(900): [mFirstLetters>Item 0,0]
10-30 14:34:55.440: I/System.out(900): [mFirstLetters>Item 10,1]
this is another strange behaviour: getItemId in the ItemListAdapter is called 5 times... always, why?
10-30 14:34:55.470: D/com.dav.pc.ui.ItemListAdapter(900): getItemId position: 0
10-30 14:34:55.470: D/com.dav.pc.ui.ItemListAdapter(900): getItemId position: 0
10-30 14:34:55.490: D/com.dav.pc.ui.ItemListAdapter(900): getItemId position: 0
10-30 14:34:55.490: D/com.dav.pc.ui.ItemListAdapter(900): getItemId position: 0
10-30 14:34:55.540: D/com.dav.pc.ui.ItemListAdapter(900): getItemId position: 0
10-30 14:35:01.940: V/com.dav.pc.ui.MainActivity(900): MainActivity.onCreateOptionsMenu called!
onQueryTextChange is fired.
Here my controlled exception, method triggered when Drawer is opened!
This method creates a new ItemListAdapter and passed to the mItemListFragment:
10-30 14:35:02.080: V/com.dav.pc.ui.MainActivity(900): MainActivity.onQueryTextChange() newText: 0
10-30 14:35:02.090: I/System.out(900): [mFirstLetters>Item 0,0]
10-30 14:35:02.100: I/System.out(900): [mFirstLetters>Item 10,1]
10-30 14:35:01.980: W/System.err(900):  at com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10-30 14:35:01.990: W/System.err(900):  at android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:35:01.990: W/System.err(900):  at android.widget.SearchView.access$1900(SearchView.java:90)
10-30 14:35:01.990: W/System.err(900):  at android.widget.SearchView$10.onTextChanged(SearchView.java:1536)
10-30 14:35:01.990: W/System.err(900):  at android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10-30 14:35:01.990: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3259)
10-30 14:35:02.000: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3110)
10-30 14:35:02.000: W/System.err(900):  at android.widget.EditText.setText(EditText.java:78)
10-30 14:35:02.000: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3085)
10-30 14:35:02.000: W/System.err(900):  at android.widget.TextView.onRestoreInstanceState(TextView.java:2985)
10-30 14:35:02.000: W/System.err(900):  at android.view.View.dispatchRestoreInstanceState(View.java:9876)
10-30 14:35:02.010: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:02.010: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:02.010: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:02.010: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:02.020: W/System.err(900):  at android.view.View.restoreHierarchyState(View.java:9854)
10-30 14:35:02.020: W/System.err(900):  at com.android.internal.view.menu.MenuBuilder.restoreActionViewStates(MenuBuilder.java:358)
10-30 14:35:02.020: W/System.err(900):  at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:412)
10-30 14:35:02.020: W/System.err(900):  at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739)
10-30 14:35:02.030: W/System.err(900):  at android.app.Activity.invalidateOptionsMenu(Activity.java:2552)
10-30 14:35:02.030: W/System.err(900):  at com.dav.pc.ui.MainActivity$1.onDrawerOpened(MainActivity.java:187)
10-30 14:35:02.030: W/System.err(900):  at android.support.v4.widget.DrawerLayout.dispatchOnDrawerOpened(DrawerLayout.java:488)
10-30 14:35:02.040: W/System.err(900):  at android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:459)
10-30 14:35:02.040: W/System.err(900):  at android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:1355)
...
10-30 14:35:42.040: V/com.dav.pc.ui.MainActivity(900): MainActivity.onCreateOptionsMenu called!
This is my controlled exception, method triggered when Drawer is closed.
Again the execution of the method.
10-30 14:35:42.170: V/com.dav.pc.ui.MainActivity(900): MainActivity.onQueryTextChange() newText: 0
10-30 14:35:42.170: I/System.out(900): [mFirstLetters>Item 0,0]
10-30 14:35:42.180: I/System.out(900): [mFirstLetters>Item 10,1]
10-30 14:35:42.080: W/System.err(900):  at com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10-30 14:35:42.080: W/System.err(900):  at android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:35:42.090: W/System.err(900):  at android.widget.SearchView.access$1900(SearchView.java:90)
10-30 14:35:42.090: W/System.err(900):  at android.widget.SearchView$10.onTextChanged(SearchView.java:1536)
10-30 14:35:42.090: W/System.err(900):  at android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10-30 14:35:42.090: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3259)
10-30 14:35:42.090: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3110)
10-30 14:35:42.090: W/System.err(900):  at android.widget.EditText.setText(EditText.java:78)
10-30 14:35:42.100: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3085)
10-30 14:35:42.100: W/System.err(900):  at android.widget.TextView.onRestoreInstanceState(TextView.java:2985)
10-30 14:35:42.100: W/System.err(900):  at android.view.View.dispatchRestoreInstanceState(View.java:9876)
10-30 14:35:42.110: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:42.110: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:42.110: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:42.110: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:35:42.120: W/System.err(900):  at android.view.View.restoreHierarchyState(View.java:9854)
10-30 14:35:42.120: W/System.err(900):  at com.android.internal.view.menu.MenuBuilder.restoreActionViewStates(MenuBuilder.java:358)
10-30 14:35:42.120: W/System.err(900):  at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:412)
10-30 14:35:42.120: W/System.err(900):  at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739)
10-30 14:35:42.130: W/System.err(900):  at android.app.Activity.invalidateOptionsMenu(Activity.java:2552)
10-30 14:35:42.130: W/System.err(900):  at com.dav.pc.ui.MainActivity$1.onDrawerClosed(MainActivity.java:180)
10-30 14:35:42.140: W/System.err(900):  at android.support.v4.widget.DrawerLayout.dispatchOnDrawerClosed(DrawerLayout.java:477)
10-30 14:35:42.140: W/System.err(900):  at android.support.v4.widget.DrawerLayout.updateDrawerState(DrawerLayout.java:457)
10-30 14:35:42.140: W/System.err(900):  at android.support.v4.widget.DrawerLayout$ViewDragCallback.onViewDragStateChanged(DrawerLayout.java:1355)
....

=========================================================================
This is when instead I select a new ItemDrawer to generate the new list with fragment transaction:
10-30 14:37:47.961: D/com.dav.pc.ui.DrawerListAdapter(900): getItemId position: 5
10-30 14:37:48.100: D/com.dav.pc.ui.DrawerListAdapter(900): getItemId position: 5
10-30 14:37:48.100: D/com.dav.pc.ui.DrawerListAdapter(900): getItemId position: 0
10-30 14:37:48.100: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected ListId selected: 4
10-30 14:37:48.100: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected ClearSearch
10-30 14:37:48.161: V/com.dav.pc.ui.MainActivity(900): MainActivity.onQueryTextChange() newText: 
(I Should avoid this useless generation when clearing the searchText)
10-30 14:37:48.170: I/System.out(900): [mFirstLetters>Item 0,0]
10-30 14:37:48.170: I/System.out(900): [mFirstLetters>Item 1,1]
10-30 14:37:48.170: I/System.out(900): [mFirstLetters>Item 10,2]
10-30 14:37:48.170: I/System.out(900): [mFirstLetters>Item 11,3]
10-30 14:37:48.170: I/System.out(900): [mFirstLetters>Item 12,4]
10-30 14:37:48.181: I/System.out(900): [mFirstLetters>Item 13,5]
10-30 14:37:48.181: I/System.out(900): [mFirstLetters>Item 14,6]
10-30 14:37:48.181: I/System.out(900): [mFirstLetters>Item 15,7]
10-30 14:37:48.181: I/System.out(900): [mFirstLetters>Item 2,8]
10-30 14:37:48.181: I/System.out(900): [mFirstLetters>Item 3,9]
10-30 14:37:48.191: I/System.out(900): [mFirstLetters>Item 4,10]
10-30 14:37:48.191: I/System.out(900): [mFirstLetters>Item 5,11]
10-30 14:37:48.191: I/System.out(900): [mFirstLetters>Item 6,12]
10-30 14:37:48.191: I/System.out(900): [mFirstLetters>Item 7,13]
10-30 14:37:48.191: I/System.out(900): [mFirstLetters>Item 8,14]
10-30 14:37:48.191: I/System.out(900): [mFirstLetters>Item 9,15]
Again my controlled exception to see the stacktrace:
10-30 14:37:48.111: W/System.err(900):  at com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10-30 14:37:48.111: W/System.err(900):  at android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:37:48.111: W/System.err(900):  at android.widget.SearchView.access$1900(SearchView.java:90)
10-30 14:37:48.121: W/System.err(900):  at android.widget.SearchView$10.onTextChanged(SearchView.java:1536)
10-30 14:37:48.121: W/System.err(900):  at android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10-30 14:37:48.121: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3259)
10-30 14:37:48.121: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3110)
10-30 14:37:48.121: W/System.err(900):  at android.widget.EditText.setText(EditText.java:78)
10-30 14:37:48.121: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3085)
10-30 14:37:48.131: W/System.err(900):  at android.widget.SearchView.setQuery(SearchView.java:481)
10-30 14:37:48.131: W/System.err(900):  at com.dav.pc.ui.MainActivity.onDrawerItemSelected(MainActivity.java:210)
10-30 14:37:48.131: W/System.err(900):  at com.dav.pc.ui.DrawerListFragment.onListItemClick(DrawerListFragment.java:153)
10-30 14:37:48.131: W/System.err(900):  at android.app.ListFragment$2.onItemClick(ListFragment.java:160)
...
10-30 14:37:48.201: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected Transaction Commit
10-30 14:37:48.201: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected Label selected: 4
10-30 14:37:48.201: D/com.dav.pc.ui.MainActivity(900): MainActivity.onDrawerItemSelected ClosingDrawer
10-30 14:37:48.201: V/com.dav.pc.ui.DrawerListFragment(900): DrawerListFragment.setSelection() called!
10-30 14:37:48.211: D/com.dav.pc.ui.DrawerListFragment(900): CurrentPosition=5
10-30 14:37:48.211: D/com.dav.pc.ui.DrawerListAdapter(900): getItemId position: 0
10-30 14:37:48.211: D/com.dav.pc.ui.DrawerListAdapter(900): getItemId position: 5
10-30 14:37:48.411: V/com.dav.pc.ui.ItemListFragment(900): ItemListFragment.onPause() called!
10-30 14:37:48.431: D/com.dav.pc.ui.ItemListFragment(900): ItemListFragment.onCreate Bundle exists
10-30 14:37:48.431: D/com.dav.pc.ui.ItemListFragment(900): Bundle[{list_id=4}]
10-30 14:37:48.431: D/com.dav.pc.ui.ItemListFragment(900): Create List 4
(The list 4 contains 6 items, we are in onCreate)
10-30 14:37:48.431: I/System.out(900): [mFirstLetters>Item 0,0]
10-30 14:37:48.431: I/System.out(900): [mFirstLetters>Item 1,1]
10-30 14:37:48.431: I/System.out(900): [mFirstLetters>Item 2,2]
10-30 14:37:48.441: I/System.out(900): [mFirstLetters>Item 3,3]
10-30 14:37:48.441: I/System.out(900): [mFirstLetters>Item 4,4]
10-30 14:37:48.441: I/System.out(900): [mFirstLetters>Item 5,5]
10-30 14:37:48.461: V/com.dav.pc.ui.ItemListFragment(900): ItemListFragment.onResume() called!
10-30 14:37:48.721: V/com.dav.pc.ui.MainActivity(900): MainActivity.onCreateOptionsMenu called!
10-30 14:37:48.811: V/com.dav.pc.ui.MainActivity(900): MainActivity.onQueryTextChange() newText: 
10-30 14:37:48.811: I/System.out(900): [mFirstLetters>Item 0,0]
10-30 14:37:48.811: I/System.out(900): [mFirstLetters>Item 1,1]
10-30 14:37:48.821: I/System.out(900): [mFirstLetters>Item 2,2]
10-30 14:37:48.821: I/System.out(900): [mFirstLetters>Item 3,3]
10-30 14:37:48.821: I/System.out(900): [mFirstLetters>Item 4,4]
10-30 14:37:48.821: I/System.out(900): [mFirstLetters>Item 5,5]
10-30 14:37:48.761: W/System.err(900):  at com.dav.pc.ui.MainActivity.onQueryTextChange(MainActivity.java:306)
10-30 14:37:48.761: W/System.err(900):  at android.widget.SearchView.onTextChanged(SearchView.java:1081)
10-30 14:37:48.761: W/System.err(900):  at android.widget.SearchView.access$1900(SearchView.java:90)
10-30 14:37:48.761: W/System.err(900):  at android.widget.SearchView$10.onTextChanged(SearchView.java:1536)
10-30 14:37:48.761: W/System.err(900):  at android.widget.TextView.sendOnTextChanged(TextView.java:7577)
10-30 14:37:48.761: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3259)
10-30 14:37:48.761: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3110)
10-30 14:37:48.771: W/System.err(900):  at android.widget.EditText.setText(EditText.java:78)
10-30 14:37:48.771: W/System.err(900):  at android.widget.TextView.setText(TextView.java:3085)
10-30 14:37:48.771: W/System.err(900):  at android.widget.TextView.onRestoreInstanceState(TextView.java:2985)
10-30 14:37:48.771: W/System.err(900):  at android.view.View.dispatchRestoreInstanceState(View.java:9876)
10-30 14:37:48.771: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:37:48.771: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:37:48.781: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:37:48.781: W/System.err(900):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2330)
10-30 14:37:48.781: W/System.err(900):  at android.view.View.restoreHierarchyState(View.java:9854)
10-30 14:37:48.781: W/System.err(900):  at com.android.internal.view.menu.MenuBuilder.restoreActionViewStates(MenuBuilder.java:358)
10-30 14:37:48.781: W/System.err(900):  at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:412)
10-30 14:37:48.781: W/System.err(900):  at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:739)
10-30 14:37:48.791: W/System.err(900):  at android.app.Activity.invalidateOptionsMenu(Activity.java:2552)
10-30 14:37:48.791: W/System.err(900):  at com.dav.pc.ui.MainActivity$1.onDrawerClosed(MainActivity.java:180)
...

解决方案

I just found a new solution that worked for me very clean, maybe someone else is interested:

In the open/close implementation of the Drawer I call directly onPrepareOptionsMenu(mMenu) instead of invalidateOptionsMenu().

As you see, I use the instance of the menu saved in mMenu at its creation. Calling this method I avoid to invalidate the searchView, that still could contain some text, therefore not to be cleared.

Here another trick (always inside onPrepareOptionsMenu) to clear/iconify the searchView I check if currently a searchText is previously set in my Service class:

if (!Service.getInstance().hasSearchText()) {
    Log.d(MainActivity.class.getSimpleName(), "onPrepareOptionsMenu Clearing SearchView!");
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    searchView.setIconified(true);// This also clears the text in SearchView widget
}