Android LiveData未更新

时间:2018-04-03 17:09:36

标签: java android observable android-livedata

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

技能的获取者是:它位于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");
        }
    });

2 个答案:

答案 0 :(得分:0)

选中此answer

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

您的技能未更新可能是因为您的观点未改变状态。

答案 1 :(得分:0)

在调用skillMutable方法之前设置observe()的值。必须在设置值之前调用observe()方法。否则,skillMutable的值更改时将无法观察。

要使其正常工作,您要做的最小的事情就是将skillMutable公开,然后在调用observe()之前先对其进行调用getSkills()

顺便说一句,我不确定为什么这里需要MutableLiveDatagetSkills()方法是否可以返回ArrayList<skill>而不是返回MutableLiveData<List>