LiveData с добавленным новым элементом через уведомление pu sh не обновляет список - PullRequest
0 голосов
/ 13 июля 2020

Я попытался добавить в список новое сообщение, пришедшее из уведомления pu sh.
Я пытался добиться этого с помощью живых данных. Я использовал привязку данных в recyclerview и в основном действии.
Удовольствие c onChanged не вызывается, когда элемент добавляется в список текущих данных в классе MsgViewModel.
что я делаю не так?

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 () не вызывается, когда есть новый элемент, добавленный в список

1 Ответ

0 голосов
/ 13 июля 2020

Проблема здесь в том, как вы создаете экземпляры ваших viewModels. Если я правильно понимаю, вы хотите, чтобы они были одними и теми же экземплярами как в activity, так и в messaging service. Один - MsgViewModel viewModel = new MsgViewModel(getApplication());

Другой - msgViewModel = new ViewModelProvider(this).get(MsgViewModel.class);

На втором - this обозначает текущий экземпляр действия. И его контекст отличается от того, который вы получаете из getApplication().

...