android - 使用谷歌地图、模型和可观察实现搜索视图的最佳方法
问题描述
好吧,它看起来很简单,但目前还没有找到任何答案。我的应用中有一个搜索视图,我想在谷歌地图标记上添加搜索功能。我的问题是考虑到以下代码实现,实现这一目标的最佳方法是什么。
我的活动被映射到一个 observable 以从数据库中检索数据,然后当我获取数据时我在地图上显示标记。一个文本视图显示计数。这是我与谷歌地图的主要片段。如您所见,我使用 observable 来更新 ui。
public class MyFragment extends Fragment{
....
private void observerSetup() {
homeViewModel.getCount().observe(this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer s) {
textView.setText(String.valueOf(s));
}
});
homeViewModel.getAll().observe(this, new Observer<List<Item>>() {
@Override
public void onChanged(@Nullable final List<Items> itemsLoaded) {
if(itemsLoaded != null){
// build markers
buildMarkersFromItems(itemsLoaded);
}
}
});
}
...
}
一切正常。现在我必须添加一个带有搜索视图的搜索功能,所以我放了这个。
/**
* ********************* SEARCH ********************
*/
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText != null && newText.length() > 0){
if(googleMap != null && markersList.size() > 0){
Marker lastMarkerFound = null;
for(Marker marker : markersList) {
Item item = (Item) marker.getTag();
boolean found = StringUtils.search(item.getName(), newText);
marker.setVisible(found);
}
}
}
// display all markers
else{
for(Marker marker : markersList){
marker.setVisible(true);
}
}
return true;
}
});
}
最后一步是在视图模型和 UI 中实现过滤器的功能,但我不知道如何实现。我必须隐藏/显示有关搜索过滤器的标记并更新计数器文本字段。还是我应该在我的片段中做一些事情?但是如何,最好的方法是什么?
这是我的模型。它使用存储库从我的数据库中检索数据。
public class HomeViewModel extends AndroidViewModel {
private MutableLiveData<String> mText;
private Repository mRepository;
public HomeViewModel(Application application) {
super(application);
mText = new MutableLiveData<>();
mRepository = new Repository(application);
}
public void filter(String text){
// how to perform something here to update ?
}
public LiveData<Integer> getCount() {
return mRepository.count();
}
public LiveData<List<Item>> getAll() { return mRepository.getAll();
谢谢您的帮助。
编辑:我发布了我的解决方案,不确定它是否是最好的但有效。如果您有任何建议,请告诉我。
解决方案
推荐阅读
- r - 如何在 shinyapps.io 中连接本地 SQL Server 机器
- python - Sparql 查询以获取类的数据属性值
- matlab - 在 Matlab 中找到与自定义方程的拟合
- python - Writing a flatMap function in Spark and Python
- python - 从主脚本导入类会创建该类的副本吗?
- java - LinkedList 对象如何使用 Syso 输出内容?
- android - 蓝牙应用程序在启动时崩溃
- heroku - Heroku 正在重置节点红色应用程序数据
- jquery - 检查 XHR 返回什么响应 Jquery
- apache - Apache 虚拟主机非 www 不工作