通过推送通知添加了新项目的LiveData无法更新列表

时间:2020-07-13 18:04:16

标签: java android android-livedata

我试图将来自推送通知的新邮件项添加到列表中。
我试图通过实时数据来实现这一目标。我在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()方法

2 个答案:

答案 0 :(得分:0)

这里的问题是如何实例化viewModels。如果我理解正确,您希望它们在activitymessaging 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());
相关问题