【问题标题】:Android LiveData Not updatingAndroid LiveData 未更新
【发布时间】:2018-04-03 17:09:35
【问题描述】:

我目前正在尝试从片段中检测另一个文件中的更改,并使用 LiveData 相应地更新 ui。我有一个类 - 带有用于我的应用程序数据的 getter 和 setter 的 datacontroller。在下面的代码中,我希望每次用户添加技能时,一个单独的片段中的 UI 都会发生变化。如果有人能指出为什么我的 UI 没有更新以及如何修复它,我将不胜感激?

技能的getter是:位于dataController类中,扩展了ViewModel

private MutableLiveData<List> skillMutable = new MutableLiveData<List>();
public  MutableLiveData<List> getSkills(){
   ArrayList<skill> listToReturn = new ArrayList<skill>();

    try {
        InputStream inputStream = context.openFileInput(skillFileName);

        if (inputStream != null) {
            InputStreamReader streamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(streamReader);

            String l;
            skill toAdd;
            while (( l = bufferedReader.readLine()) != null) {

                System.out.println("MY line  is" + l);
                String[] skillSeparated = l.split("_");
                toAdd= new skill(skillSeparated[0], skillSeparated[1]);
                listToReturn.add(toAdd);
            }

        }

        inputStream.close(); //close the file
    } catch (java.io.FileNotFoundException e) {
        //file doesnt exist
    } catch (IOException e) {
        e.printStackTrace();
    }
    skillMutable.setValue(listToReturn);
    return skillMutable;
}

更新UI的代码是:这里,它位于一个扩展Fragment的类中

dataManager = new dataController(getContext());

    dataManager.getSkills().observe(this, skillMutable -> {
        // update UI
        if(dataManager.getResumeNumber() == "1") {
            resumeWebview.loadData(pdfManager.getResume1(), "text/html; charset=utf-8", "UTF-8");
        }
    });

【问题讨论】:

    标签: java android observable android-livedata


    【解决方案1】:

    skillMutable 的值是在调用 observe() 方法之前设置的。必须在设置值之前调用observe() 方法。否则,当 skillMutable 的值发生变化时,没有任何观察到。

    您可以做的最少的事情是让skillMutable 公开,然后在调用getSkills() 之前调用observe()。

    顺便说一句,我不确定这里为什么需要MutableLiveData。 getSkills() 方法能否返回 ArrayList&lt;skill&gt; 而不是返回 MutableLiveData&lt;List&gt;?

    【讨论】:

      【解决方案2】:

      查看answer

      LiveData 接收观察者,并仅在其处于 STARTED 或 RESUMED 状态时通知其数据更改。

      你的技能没有更新可能是因为你的视图没有改变状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        相关资源
        最近更新 更多