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

时间:2018-09-07 18:41:47

标签: java android android-livedata mutablelivedata

上下文

使用MutableLiveData<List<Integer>>保存一个值。当List中的第一个值(为简洁起见,以第一个值为例)增加时,TextView应该在onChanged中更新以在List中显示第一个值。 / p>

目标

  • 增加List中的第一个值
  • TextView的第一项更改时更新List

问题

  1. 单击Button时,List中的第一个值会增加,但不会调用MutableLiveData.onChanged(),这是为什么?
  2. MutableLiveData仅响应其setValue方法吗?
  3. 是否可以通过包含List个整数(即MutableLiveData的{​​{1}}来解决此问题,因为需要MutableLiveData<List<MutableLiveData<Integer>>中的每个项都需要侦听器)
  4. 是否有更好的方法实现目标?

代码

List

2 个答案:

答案 0 :(得分:1)

LiveData仅在调用onChangedsetValue()之后才调用Observable的postValue().setValue()方法,因为postValue()应该从其他线程调用(onClick发生在主线程上,因此setValue()会发生)。 无论如何,使用下面的代码将满足您的需求:

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
    // first val in List is incremented but onChanged isn't called, why?
    List<Integer> temp = vals.getValue();
    if(temp!=null) // null-safety just in case....
    {
        int newVal = temp.get(0) + 1;
        temp.set(0, newVal);
        vals.setValue(temp);
        Log.d(TAG, "set val at index 0 to " + newVal);
    }
}
});

答案 1 :(得分:-1)

您应该调用setValue或postValue来更新LiveData,否则它将不会被观察到,主要是;我想像您使用postValue那样,因为setValue必须在主线程中调用