【发布时间】: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