
我正在研究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中的on search search text changed方法调用的:
@OverrIDe public boolean onqueryTextChange(String newText) { try { searchDatabase(newText); } catch (ExecutionException e) { e.printstacktrace(); } catch (InterruptedException e) { e.printstacktrace(); } return false; }但它只是没有做我原来的recyclervIEw内容永远不会改变任何想法?
解决方法:
您可以使用transformation.switchMap进行搜索 *** 作.
>在viewmodel中创建具有最新搜索字符串的mutablelivedata.
>内部视图模型使用:
liveData<Data> data = liveDatatransformations.switchMap(searchStringliveData, string -> repo.loadData(string)))>将上述实时数据返回给活动,以便观察和更新视图.
总结以上是内存溢出为你收集整理的Android使用视图模型和实时数据实现搜索全部内容,希望文章能够帮你解决Android使用视图模型和实时数据实现搜索所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)