How To Search In Listview From Toolbar In Fragment
I was using this code to search from my MainActivity Toolbar in a ListView: SearchView searchView; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater
Solution 1:
A better approach can be using EventBus. It's really helpful in a scenario like this in which we have to pass certain data from an Activity to a Fragment.
For using EventBus, you need to define a POJO class, somewhat like this:
classSearchQueryEvent {
String query;
publicSearchQueryEvent(String query) {
this.query=query;
}
publicStringgetQuery() {
return query;
}
}
Now, your code should be modified like this:
MainActivity.java
SearchView searchView;
@OverridepublicbooleanonCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate( R.menu.main, menu);
MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
searchView = (SearchView) myActionMenuItem.getActionView();
searchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
@OverridepublicbooleanonQueryTextSubmit(String query) {
returnfalse;
}
@OverridepublicbooleanonQueryTextChange(String s) {
EventBus.getDefault().post(newSearchQueryEvent(s));
returnfalse;
}
});
returntrue;
}
YourFragment.java
@OverridepublicvoidonResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@OverridepublicvoidonPause() {
EventBus.getDefault().unregister(this);
super.onPause();
}
@Subscribe(threadMode = ThreadMode.MAIN)
publicvoidonSearchQuery(SearchQueryEvent event) {
String query=event.getQuery();
adapter.getFilter().filter(query);
}
Solution 2:
Try This code,
activity_main.xml :
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="#009688" /><fragmentxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/fragment"android:name="ru.lemmaproj.toolbar_search.MainActivityFragment"android:layout_width="match_parent"android:layout_height="match_parent"tools:layout="@layout/fragment_main" /></LinearLayout>
fragment_main.xml :
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivityFragment">
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
search_layout.xml :
<EditTextxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:cursorVisible="true"android:imeOptions="actionDone"android:inputType="text" />
MainActivity.java :
publicclassMainActivityextendsAppCompatActivity {
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbartoolbar= (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
}
MainActivityFragment.java :
publicclassMainActivityFragmentextendsFragment {
private final String[] items = newString[] { "Android", "iOS", "Windows Phone",
"Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", "Linux", "OS/2" };
privateListView listView;
privateArrayAdapter<String> adapter;
@OverridepublicViewonCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
listView = (ListView) view.findViewById(R.id.list);
adapter = newArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
return view;
}
@OverridepublicvoidonActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}
@OverridepublicvoidonCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_fragment, menu);
MenuItem searchItem = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
if (searchView != null) {
searchView.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
@OverridepublicbooleanonQueryTextSubmit(String query) {
returntrue;
}
@OverridepublicbooleanonQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
returntrue;
}
});
}
}
}
Solution 3:
1-> Create a static method in fragment
publicstaticvoiddoSearch(String query){
yourAdapter.filter(query);
}
2-> Call this method from activity on onQueryTextChange method and pass the query you want to search
@OverridepublicbooleanonCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.home, menu);
MenuItem myActionMenuItem = menu.findItem(R.id.action_search);
searchViewShop = (SearchView) myActionMenuItem.getActionView();
searchViewShop.setOnQueryTextListener(newSearchView.OnQueryTextListener() {
@OverridepublicbooleanonQueryTextSubmit(String query) {
returntrue;
}
@OverridepublicbooleanonQueryTextChange(String newText) {
YourFragment.doSearch(newText);
returntrue;
}
});
returntrue;
}
Post a Comment for "How To Search In Listview From Toolbar In Fragment"