为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 2021-09-03 21:51:49
语境使用MutableLiveData<List<Integer>>持有的值。当 中的第一个值(为简洁起见使用第一个值作为示例)List递增时,TextView应更新 inonChanged以显示List.目标增加 a 中的第一个值 ListTextView当第一项List更改时更新问题在Button点击,在第一个值List递增,但MutableLiveData.onChanged()不叫,这是为什么?是否MutableLiveData只响应其setValue方法?这是否可以通过List包含MutableLiveData整数来解决(即MutableLiveData<List<MutableLiveData<Integer>>,有问题,因为 中的每个项目都需要侦听器List)?有没有更好的方法来实现目标?代码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);    }});
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

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);

    }

}

});


查看完整回答
反对 回复 2021-09-03
  • 1 回答
  • 0 关注
  • 411 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信