Как решить ошибку «анонимный класс, полученный из наблюдателя» с помощью метода наблюдателя в viewModel - PullRequest
0 голосов
/ 28 января 2019

Я успешно использовал метод наблюдателя в MainActivity(), который выглядит следующим образом:

public void inputNameTest(String inputName) {
    myViewModel.inputNameTesting(inputName).observe( this, new Observer<List<MyRoomEntity>>() {
        @Override
        public void onChanged(@Nullable List<MyRoomEntity> myRoomEntities) {
            //Sets data in RecyclerView
            myAdapter.setList( myRoomEntities );
        }
    } );
}

Это задает пользовательские данные для запроса Room и отображает запрос в RecyclerView.Я хотел бы переместить функцию на ViewModel, чтобы не загромождать View.

В ViewModel я получаю красное подчеркивание на new Observer<List<MyRoomEntity>>(), которое говорит anonymous class must either be declared abstract or implement abstract method

Если я изменю Observer на new android.arch.lifecycle.Observer<List<MyRoomEntity>>() (как предложено Android-Studio), то красное подчеркивание исчезнет.

Мне также нужно передать параметр owner вместо this.Я управляю этим путем передачи this из MainActivity()

myViewModel.setOwner( this );

в мой ViewModel

public void setOwner(LifecycleOwner owner) {
    this.mOwner = owner;
}

Когда я закончу, мой метод Observer в моем ViewModel выглядит так:

public void getUserInputName(String inputName) {
    repository.getUserInputName(inputName).observe( mOwner, new android.arch.lifecycle.Observer<List<MyRoomEntity>>() {
        @Override
        public void onChanged(@Nullable List<MyRoomEntity> myRoomEntities) {

            Log.d("TAG", "OBSERVED INPUT NAME");
            if(myRoomEntities != null) {
                for(MyRoomEntity item: myRoomEntities) {
                    Log.d("TAG ROOM ", "Input Name: " + item.toString());
                }
            }
            myAdapter.setList( myRoomEntities );

        }
    } );
}

Ошибка не возникает, но по какой-то причине в RecyclerView ничего не отображается.Я получаю правильный Log вывод из Observer метода:

Input Name: MyRoomEntity{id=2, name='Joe', date='1/3/2015', from='12.30', until='13:00'}

Итак, если я напишу «Джо» в поле EditText и нажму кнопку, в * ничего не отображается1044 * но я получаю правильный Log.Если я оставлю метод Observer в MainActivity(), я получу правильные значения Log и RecyclerView.

Не знаю, что не так, но это должно быть что-то с двумя изменениями, которые я сделал с помощью метода Observer.

1 Ответ

0 голосов
/ 28 января 2019

этой реализацией вы выбрасываете всю работу Google в мусорное ведро, потому что вы предоставляете ссылку MainActivity на класс ViewModel, и основной смысл использования MVVM состоит в том, чтобы избежать этой проблемы, чтобы обеспечить ее безопасность в случае, если ваша деятельность или фрагмент будут уничтожены и будутвозможность сохранить состояние данных в случае растрации экрана.Поэтому не перемещайте код наблюдателя внутри класса ViewModel, поскольку он не «загромождает» действие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...