为什么在 LiveData 列表中更改值时不调用 onChanged?

语境

使用MutableLiveData<List<Integer>>持有的值。当 中的第一个值(为简洁起见使用第一个值作为示例)List递增时,TextView应更新 inonChanged以显示List.

目标

  • 增加 a 中的第一个值 List

  • TextView当第一项List更改时更新

问题

  1. Button点击,在第一个值List递增,但MutableLiveData.onChanged()不叫,这是为什么?

  2. 是否MutableLiveData只响应其setValue方法?

  3. 这是否可以通过List包含MutableLiveData整数来解决(即MutableLiveData<List<MutableLiveData<Integer>>,有问题,因为 中的每个项目都需要侦听器List)?

  4. 有没有更好的方法来实现目标?

代码

final MutableLiveData<List<Integer>> vals = new MutableLiveData<>();

List<Integer> intVals = new ArrayList<>();

intVals.add(0);

vals.setValue(intVals);


tv.setText("" + vals.getValue().get(0));


vals.observe(this, new Observer<List<Integer>>() {

    @Override

    public void onChanged(@Nullable List<Integer> integers) {

        int firstVal = integers.get(0);

        Log.d(TAG, "onChanged val " + firstVal);

        tv.setText("" + firstVal);

    }

});


btn.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

        // first val in List is incremented but onChanged isn't called, why?

        int newVal = vals.getValue().get(0) + 1;

        vals.getValue().set(0, newVal);

        Log.d(TAG, "set val at index 0 to " + newVal);

    }

});


慕容森
浏览 412回答 1
1回答

哔哔one

LiveDataObservable 的onChanged方法仅在调用后才被调用,setValue()或者postValue().setValue()应该只从主线程postValue()调用,因为应该从不同的线程调用(onClick发生在主线程上也是如此setValue())。无论如何,使用下面的代码将为您提供所需的东西:btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {&nbsp; &nbsp; // first val in List is incremented but onChanged isn't called, why?&nbsp; &nbsp; List<Integer> temp = vals.getValue();&nbsp; &nbsp; if(temp!=null) // null-safety just in case....&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; int newVal = temp.get(0) + 1;&nbsp; &nbsp; &nbsp; &nbsp; temp.set(0, newVal);&nbsp; &nbsp; &nbsp; &nbsp; vals.setValue(temp);&nbsp; &nbsp; &nbsp; &nbsp; Log.d(TAG, "set val at index 0 to " + newVal);&nbsp; &nbsp; }}});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java