我正在为Udacity课程做一个安卓项目,目前正试图实现搜索功能,同时遵循安卓架构组件并使用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
中的on search query text changed方法调用的:
@Override
public boolean onQueryTextChange(String newText) {
try {
searchDatabase(newText);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return false;
}
但它什么也没做,我的原始recyclerview
内容从未改变,有什么想法吗?