上下文
使用MutableLiveData<List<Integer>>
保存一个值。当List
中的第一个值(为简洁起见,以第一个值为例)增加时,TextView
应该在onChanged
中更新以在List
中显示第一个值。 / p>
目标
List
中的第一个值TextView
的第一项更改时更新List
问题
Button
时,List
中的第一个值会增加,但不会调用MutableLiveData.onChanged()
,这是为什么? MutableLiveData
仅响应其setValue
方法吗? List
个整数(即MutableLiveData
的{{1}}来解决此问题,因为需要MutableLiveData<List<MutableLiveData<Integer>>
中的每个项都需要侦听器) 代码
List
答案 0 :(得分:1)
LiveData
仅在调用onChanged
或setValue()
之后才调用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必须在主线程中调用