Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未触发MutableLiveData的观察者_Java_Android_Mvvm_Mutablelivedata - Fatal编程技术网

Java 未触发MutableLiveData的观察者

Java 未触发MutableLiveData的观察者,java,android,mvvm,mutablelivedata,Java,Android,Mvvm,Mutablelivedata,我正在使用MutableLiveData开发一个活动,以使我的片段与从搜索中检索到的结果保持最新,但在结果列表更新后不会触发观察者 在主活动中,我有一个EditText,在其中键入我要搜索的内容,在它的正下方有一个ViewPager小部件,其中有三个选项,结果在三个不同的片段上细分为三个类别。当我第一次进入活动时,我运行初始搜索以检索数据并填充三个片段。这很好用 SearchActivity.java @凌驾 受保护的void onCreateBundle savedInstanceState{

我正在使用MutableLiveData开发一个活动,以使我的片段与从搜索中检索到的结果保持最新,但在结果列表更新后不会触发观察者

在主活动中,我有一个EditText,在其中键入我要搜索的内容,在它的正下方有一个ViewPager小部件,其中有三个选项,结果在三个不同的片段上细分为三个类别。当我第一次进入活动时,我运行初始搜索以检索数据并填充三个片段。这很好用

SearchActivity.java

@凌驾 受保护的void onCreateBundle savedInstanceState{ super.onCreatesavedInstanceState; setContentViewR.layout.activity\u搜索; mViewModel=ViewModelProviders.ofthis.getSearchViewModel.class; /*初始化选项卡菜单*/ TabLayout tabSearchMenu=findviewbydr.id.tabSearchMenu; ViewPager vpSearch=findviewbydr.id.vpSearchResult; TabSearchPageAdapter TabSearchPageAdapter=新建TabSearchPageAdaptergetSupportFragmentManager,tabSearchMenu.getTabCount; vpSearch.setAdapterAbsearchPageAdapter; vpSearch.addOnPageChangeListenernew TabLayout.TabLayoutOnPageChangeListenertabSearchMenu; /*初始搜索*/ etxtSearch=findviewbydr.id.etxtSearch; etxtSearch.setOnEditorActionListenertextView,actionId,keyEvent->{ 如果actionId==EditorInfo.IME_ACTION_SEARCH | | actionId==EditorInfo.IME_ACTION_DONE ||keyEvent.getAction==keyEvent.ACTION_向下| | keyEvent.getAction==keyEvent.KEYCODE_回车{ mViewModel.searchTextetxtSearch.getText.toString; } 返回false; }; } SearchViewModel.java

公共类SearchViewModel扩展了ViewModel{ 私有MutableLiveData listProducts=new MutableLiveDatanew ArrayList; 私有列表MPProducts=新的ArrayList; [...] 公共无效搜索文本字符串文本{ //进行搜索。。。 // ... // ... //处理Json结果。 CompletionHandler CompletionHandler=内容,错误->{ 如果content!=null&&content.length>0{ Log.dTAG,content.toString; Log.dTAG,searchText:找到的结果。; listProducts=new-MutableLiveDatanew-ArrayList; MPProducts=新阵列列表; 试一试{ JSONArray products=content.getjsonarrayhis; 对于int i=0;i @凌驾 public void onCreateBundle savedInstanceState{ super.onCreatesavedInstanceState; 初始片段; } [...] 私有无效初始片段{ mViewModel=ViewModelProviders.ofObjects.requireNonNullgetActivity.getSearchViewModel.class; mViewModel.SearchProducts; 最终观察者列表观察者=结果->{ Log.dTAG,listObserver:已修改观察者。; 如果result.size>0{ 初始产品列表结果; } }; mViewModel.getProductList.observegetActivity,listObserver; } 已经尝试将片段中的InitFragment方法移动到OnActivityCreated,但也没有成功。 我知道一个事实,不起作用的是观察者没有被触发。我已经用断点做了测试

正如你们所看到的,当片段被初始化时,方法SearchProducts被调用,结果被完美地发送到MutableLiveData,观察者被触发。但是,每当我运行一个调用函数searchText的搜索,从中检索结果,并更新变量的值,直到此时为止,观察者都不会被触发

额外信息:

我试着在服务器上激活的片段上下搜索 寻呼机。两个都不起作用。
有什么想法吗?

问题是您返回的是MutableLiveData的不同实例,但您的片段只观察到它在InitFragment方法中得到的第一个实例

您还将listProducts设置为MutableLiveData的多个实例,首先在声明站点,然后在t中 他搜索文本方法,而不仅仅是更新它所持有的值

为了详细说明,您不需要在getProductsList方法中进行null检查,因为在创建视图模型时,listProducts被初始化为MutableLiveData的新实例


现在,该MutableLiveData实例持有的值可能为null。。只有这个值应该通过setValue更新。对MutableLiveData值的任何空检查都可以在您在片段中创建的观察者中完成。

我不是100%确定,但我相信Android团队会讨论您面临的问题。