我试图将来自推送通知的新邮件项添加到列表中。
我试图通过实时数据来实现这一目标。我在recyclerview和主要活动中使用了数据绑定。
将项目添加到MsgViewModel类的实时数据列表中时,不会调用func onChanged。
我做错了什么?
public class MyFirebaseMessagingService extends FirebaseMessagingService {
......
private void showNotification(Map<String, String> data) {
id = data.get("id");
phone = data.get("phone");
locations = data.get("locations");
textMessage = data.get("textMessage");
MsgViewModel viewModel = new MsgViewModel(getApplication());
viewModel.addMessage(new Message(id, phone, locations, textMessage));
}
public class MsgViewModel extends AndroidViewModel {
private MutableLiveData<ArrayList<Message>> messageArrayList;
public MsgViewModel(@NonNull Application application) {
super(application);
messageArrayList = new MutableLiveData<>();
}
public void addMessage(Message message){
List<Message> messages = messageArrayList.getValue();
ArrayList<Message> cloneMessageList;
if(messages == null){
cloneMessageList = new ArrayList<>();
}else {
cloneMessageList = new ArrayList<>(messages.size());
for (int i = 0; i < messages.size(); i++){
cloneMessageList.add(new Message(messages.get(i)));
}
}
cloneMessageList.add(message);
messageArrayList.postValue(cloneMessageList);
}
public MutableLiveData<ArrayList<Message>> getMessageList(){
return messageArrayList;
}
}
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private MsgViewModel msgViewModel;
private MsgListAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.contentMainId.recyclerview.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
binding.contentMainId.recyclerview.setLayoutManager(layoutManager);
msgViewModel = new ViewModelProvider(this).get(MsgViewModel.class);
msgViewModel.getMessageList().observe(this, new Observer<ArrayList<Message>>() {
@Override
public void onChanged(ArrayList<Message> list) {
mAdapter = new MsgListAdapter(getApplication(), list);
binding.contentMainId.recyclerview.setAdapter(mAdapter);
// mAdapter.notifyDataSetChanged();
}
});
}
任何不更新适配器的帮助都将受到赞赏
==========更新=======
当有新项目添加到列表中时,不会调用onChanged()方法
答案 0 :(得分:0)
这里的问题是如何实例化viewModels。如果我理解正确,您希望它们在activity
和messaging service
中都是相同的实例。
一个是MsgViewModel viewModel = new MsgViewModel(getApplication());
另一个是msgViewModel = new ViewModelProvider(this).get(MsgViewModel.class);
第二个this
代表活动的当前实例。而且其上下文与您从getApplication()
获得的上下文不同。
答案 1 :(得分:0)
据我所知,当您调用“postValue()”或“setValue()”方法时,您应该提供诸如 oldMutableList.toList() 之类的新对象。
换句话说,在livedata的'postvalue()'方法中将列表作为参数输入后,即使将新值添加到列表中,也无法识别livedata。为了让观察者能够识别,新创建的list对象必须在再次调用postvalue时作为参数输入。
_liveData.postValue(list.toList()) // "list.toList()" <- this code generate new List object which has another hashcode.
or
_liveData.postValue(list.sortedBy(it.somethingField))
抱歉这个 kotlin 代码,不是 java。
// this original in your code
messageArrayList.postValue(cloneMessageList);
// change to these codes
messageArrayList.postValue(new ArrayList(cloneMessageList));
or
messageArrayList.postValue(cloneMessageList.toList());