Я работаю над проектом для Android по курсу udacity. В настоящее время я пытаюсь реализовать функцию поиска, придерживаясь компонентов архитектуры Android и используя Firestore и комнату. Я довольно новичок во всех этих концепциях, поэтому, пожалуйста, укажите все, что кажется неправильным.
Поэтому я создал хранилище базы данных, чтобы синхронизировать базы данных пожарного депо и помещения и доставлять данные. Затем я использую viewmodel и шаблон наблюдателя (я думаю), поэтому мой наблюдатель получает данные и ищет изменения, передает их моему адаптеру (refreshMyList(List)
), который заполняет recyclerview
следующим образом:
contactViewModel = ViewModelProviders.of(this).get(ContactsViewModel.class);
contactViewModel.getAllContacts().observe(this, new
Observer<List<DatabaseContacts>>() {
@Override
public void onChanged(@Nullable List<DatabaseContacts>
databaseContacts) {
ArrayList<DatabaseContacts> tempList = new ArrayList<>();
tempList.addAll(databaseContacts);
contactsAdapter.refreshMyList(tempList);
if (tempList.size() < 1) {
results.setVisibility(View.VISIBLE);
} else {
results.setVisibility(View.GONE);
}
}
});
Теперь я хочу выполнить поиск данных, у меня все запросы в комнате настроены нормально, и в моем хранилище данных есть методы для получения контактов на основе строки поиска, но я не могу обновить свой список. читал, что есть способы сделать это как Transformations.switchMap? но я не могу понять, как это работает, может кто-нибудь мне помочь
В настоящее время я пытаюсь вернуть список результатов от асинхронной задачи, она использовалась для возврата текущих данных, но я изменил ее, поскольку getValue()
всегда был null
, не уверен, что это правильно, вот асинхронность:
private static class searchContactByName extends AsyncTask<String, Void,
ArrayList<DatabaseContacts>> {
private LiveDatabaseContactsDao mDao;
searchContactByName(LiveDatabaseContactsDao dao){
this.mDao = dao;
}
@Override
protected ArrayList<DatabaseContacts> doInBackground(String... params) {
ArrayList<DatabaseContacts> contactsArrayList = new ArrayList<>();
mDao.findByName("%" + params[0] + "%");
return contactsArrayList;
}
}
Я вызываю это из своего хранилища контактов в своей собственной оболочке:
public List<DatabaseContacts> getContactByName(String name) throws
ExecutionException, InterruptedException {
//return databaseContactsDao.findByName(name);
return new searchContactByName(databaseContactsDao).execute(name).get();
}
и это называется из моей модели вида следующим образом:
public List<DatabaseContacts> getContactByName(String name) throws
ExecutionException, InterruptedException {
return contactRepository.getContactByName(name);
}
Я тогда вызываю это из моего фрагмента:
private void searchDatabase(String searchString) throws ExecutionException,
InterruptedException {
List<DatabaseContacts> searchedContacts =
contactViewModel.getContactByName("%" + searchString + "%");
ArrayList<DatabaseContacts> contactsArrayList = new ArrayList<>();
if (searchedContacts != null){
contactsArrayList.addAll(searchedContacts);
contactsAdapter.refreshMyList(contactsArrayList);
}
}
и это вызывается из метода изменения текста поискового запроса в моем onCreateOptionsMenu
:
@Override
public boolean onQueryTextChange(String newText) {
try {
searchDatabase(newText);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
но это ничего не меняет в моем исходном recyclerview
содержании, никогда не меняются идеи?