【问题标题】:I can't sort RercyclerView list with SearchView我无法使用 SearchView 对 RercyclerView 列表进行排序
【发布时间】:2019-12-01 05:36:07
【问题描述】:

我有一个包含片段的“ProfileBaseActivity”。活动在 xml 中有一个自定义工具栏:

...

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:elevation="0dp"
        android:minHeight="?attr/actionBarSize"
        ....
        />

...

我在活动中设置我的工具栏,为每个使用 Java 的片段:

private void setupToolbar() {
        toolbar.getMenu().clear();
        toolbar.inflateMenu(R.menu.top_navigation);

        ...
    }

我在 3 个片段中有相同的工具栏,但我的第 4 个片段包含一个 RecyclerView 列表。我想更改该片段中的工具栏以使用 SearchView 对列表进行排序,所以我创建了一个菜单 xml:

<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <item
        android:id="@+id/action_search_view"
        android:title="Search"
        android:icon="@drawable/toolbar_serach_icon"
        app:showAsAction="always"
        app:actionViewClass="android.support.v7.widget.SearchView"
        />

</menu>

如果用户转到“搜索”片段,“ProfileBaseActivity”只会清除工具栏的菜单,如toolbar.getMenu().clear();

在我的“搜索”片段中,我正在尝试设置我的工具栏。我尝试了两种不同的方法:

第一个

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_search, container, false);
        recyclerView = view.findViewById(R.id.companies_rec_view);
        adapter = new CompanyListRecyclerViewAdapter(getContext(), companies);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(adapter);
        setHasOptionsMenu(true);
        return view;
    }

        @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.toolbar_serach, menu);
        MenuItem menuItem = menu.findItem(R.id.action_search_view);
        SearchView searchView = (SearchView) menuItem.getActionView();
        searchView.setOnQueryTextListener(this);
        super.onCreateOptionsMenu(menu, inflater);
    }

此解决方案不起作用,因为 SearchView 未显示在工具栏中。

第二

 @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_search, container, false);

        toolbar = getActivity().findViewById(R.id.toolbar);
        toolbar.inflateMenu(R.menu.toolbar_serach);
        MenuItem menuItem = toolbar.getMenu().findItem(R.id.action_search_view);
        SearchView searchView = (SearchView) menuItem.getActionView();
        searchView.setOnQueryTextListener(this);

        recyclerView = view.findViewById(R.id.companies_rec_view);
        adapter = new CompanyListRecyclerViewAdapter(getContext(), companies);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setAdapter(adapter);
        return view;
    }

这个版本好一点,因为Toolbar中显示了SearchView,可惜它在SearchView searchView = (SearchView) menuItem.getActionView();行抛出了NullPointerException

当然,我已经在我的 Fragment 中实现了 SearchView,例如 SearchFragment extends Fragment implements SearchView.OnQueryTextListener,并且我已经覆盖了来自接口的两个方法:

@Override
    public boolean onQueryTextSubmit(String s) {
        return false;
    }

    @Override
    public boolean onQueryTextChange(String s) {

        List<Company> companiesNewList = new ArrayList<>();

        for(Company company : companies){
            if(company.getName().toLowerCase().equals(s.toLowerCase()) || company.getCity().equals(s.toLowerCase())){
                companiesNewList.add(company);
            }
        }

        adapter.updateList(companiesNewList);

        return true;
    }

另外,我在我的 RecyclerViewAdapter 中写了一个方法来更新列表:

public void updateList(List<Company> list){
        companies = new ArrayList<>();
        companies.addAll(list);
        notifyDataSetChanged();
    }

我做错了什么?

【问题讨论】:

  • 试试看this
  • 其实我没有使用 ActionBarCompat。 :\
  • 看看其他建议的答案。可能值得一试。
  • @ChrisvinJem 我尝试了几乎所有可能的解决方案..但没有任何效果。就像 onCreateOptionsMenu 什么都做不了。 :\

标签: java android android-recyclerview toolbar searchview


【解决方案1】:
     @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.search_menu, menu);
    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getActivity().getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);
    // listening to search query text change
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // filter recycler view when query submitted
            getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            // filter recycler view when text is changed
            getFilter().filter(query);
            return false;
        }
    });

    super.onCreateOptionsMenu(menu, inflater);
}

【讨论】:

  • 是不是“updateList”方法? (去适配器?)我很确定不是更新问题..我在实现 searchView 时遇到问题。正如我提到的,我有两个解决方案..一个是抛出一个 NullPointer.. 而另一个解决方案..我无法在工具栏中看到我的 SearchView。
  • 检查更新的答案尝试使用菜单而不是菜单项
  • 在这个版本中,我不需要我的片段来实现 SerachView,对吗? :)
  • 是的,你不需要
  • 我已经尝试过您的解决方案,但我仍然无法在工具栏中看到我的 SearchView。构造我的片段时,似乎未加载 onCreateOptionMenu 。我很确定这个答案将是最好的解决方案..但是你可以再次检查我的问题吗?我不知道为什么 onCreateOptionsMenu 没有将 searchSview 膨胀到我的工具栏中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多