【发布时间】:2018-12-11 18:43:36
【问题描述】:
我正在为 udacity 课程在 android 中开发一个项目我目前正在尝试实现搜索功能,同时遵循 android 架构组件并使用 firestore 和 room 我对所有这些概念都很陌生,所以请指出任何看起来不对的地方。
所以我创建了一个数据库存储库,以保持我的 firestore 和 room 数据库同步并传递数据。然后我使用 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 内容并没有改变任何想法?
【问题讨论】:
标签: android search observable android-livedata