Деятельность с несколькими объектами живых данных - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть таблица, содержащая список карт, в моей комнате дБ. У меня есть 2 вида переработчика в моем фрагменте. Необходимо заполнить эти представления о переработчике на основе идентификаторов карт. Всякий раз, когда происходит изменение в этой таблице, текущие данные дают обратный вызов обоим представлениям переработчика. Вместо этого я хочу, чтобы эта конкретная карта d обновлялась, только тогда текущие данные обновляют мой пользовательский интерфейс. Прямо сейчас, если какие-либо идентификационные данные обновляются, я получаю обратный вызов к обоим представлениям переработчика. Например, если передано d «Sbi», то при изменении строки данных sbi обновите только первое представление переработчика, а не второе представление переработчика. Также, если переданный идентификатор равен "sbi", то пока игнорируйте обновления в других идентификаторах.

ДЕЯТЕЛЬНОСТЬ

@Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

myViewModel.getFirstData("Sbi")).observe(this,
                result -> {
                    myFirstAdapter.addList(result);
                });

myViewModel.getSecondData("Sbi1").observe(this,
                result -> {
                    mySecondAdapter.addList(result);
                });
}

MyViewModel

public LiveData<List<MyModel>> getFirstData(String cardId) {
        return myDao.getItems(cardId);
    }

public LiveData<List<MyModel>> getSecondData(String cardDetailId) {
        return myDao.getItems(cardDetailId);
    }

1 Ответ

1 голос
/ 27 апреля 2020
  1. Когда вы используете Room с LiveData - под капотом Room-framework генерирует некоторый низкоуровневый код котельной пластины, который отвечает за вызов этого магического c «обратного вызова» при некотором изменении в Таблица. Это выглядит как:

    mObserver = new InvalidationTracker.Observer(tableNames) {...

Согласно документации этот метод "добавляет данного наблюдателя в список наблюдателей, и он будет уведомляется, если в какой-либо таблице наблюдаются изменения ". Как я понимаю, Room не включает какой-нибудь «умный режим», где он анализирует параметры конкретного запроса c (с «где id: = ...» в вашем случае), и он вызывает ваши наблюдатели-LiveData-обратные вызовы всякий раз, когда изменения таблицы, независимо от того, какой идентификатор вы упомянули в вашей LiveData-функции. Другими словами, если вы используете Room, вы будете давать оба обратных вызова наблюдений при каждом изменении связанной таблицы sqlite.

Если ваш RecyclerViewAdapter использует DiffUtils (если он не используется, начните делать это), у вас не возникнет проблем с регулярным обновлением RecyclerView. На самом деле обновления не будет, потому что список данных не изменился.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...