0

语境

用于MutableLiveData<List<Integer>>保存值。当 中的第一个值(为简洁起见,以第一个值为例)List递增时,TextView应更新onChanged以显示 中的第一个值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);
    }
});
4

2 回答 2

2

LiveDataObservable 的onChanged方法仅在调用后调用setValue(),或者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);
    }
}
});
于 2018-09-07T19:04:26.567 回答
-1

你应该调用 setValue 或 postValue 来更新 LiveData,否则它不会被观察到,主要是我希望你使用 postValue 因为 setValue 必须在主线程中调用

于 2019-03-01T08:59:20.457 回答