首页 > 解决方案 > 使用谷歌地图、模型和可观察实现搜索视图的最佳方法

问题描述

好吧,它看起来很简单,但目前还没有找到任何答案。我的应用中有一个搜索视图,我想在谷歌地图标记上添加搜索功能。我的问题是考虑到以下代码实现,实现这一目标的最佳方法是什么。

我的活动被映射到一个 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(); 

谢谢您的帮助。

编辑:我发布了我的解决方案,不确定它是否是最好的但有效。如果您有任何建议,请告诉我。

标签: androidgoogle-maps-markersviewmodelsearchview

解决方案


推荐阅读