I have implemented SearchView in MaterialToolBar in my project. Everything working fine except for the final step. When I type anything in the search bar and click on the keyboard find button, it doesn't show anything. Please help.
Video of my problem https://drive.google.com/file/d/1GpE16D3drLGYp0ZetHgNlT8s7qZSFuWk/view?usp=drivesdk
Menu.xml
<item
android:id="@+id/menu_search"
android:title="@string/search"
android:icon="@drawable/ic_search"
app:showAsAction="always|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
activity.xml
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/category1_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingEnd="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/dark_blue"
app:menu="@menu/cart_share"
tools:ignore="RtlSymmetry">
<ImageView
android:id="@+id/img_back_all_category"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:contentDescription="TODO"
android:src="@drawable/ic_keyboard_arrow_left" />
<TextView
android:id="@+id/tv_all_categories"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/product_name"
android:fontFamily="@font/montserrat"
android:textStyle="bold"
android:textSize="20sp"
android:textColor="@color/white"
android:layout_marginStart="25sp"/>
</com.google.android.material.appbar.MaterialToolbar>
java code
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.cart_search_menu, menu);
MenuItem menuItem = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setQueryHint("Type here to search");
searchView.setMaxWidth(android.R.attr.width);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
//getSearchResults(query); Also tried
getSearchResults(searchView.getQuery().toString());
if( ! searchView.isIconified()) {
searchView.setIconified(true);
}
menuItem.collapseActionView();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.cart_search_menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setMaxWidth(Integer.MAX_VALUE);
SearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// your code
return false;
}
@Override
public boolean onQueryTextChange(String query) {
// your code
return false;
}
});
return true;
}
Check this screenshot try this
in menu file:
<item
android:id="@+id/actionTenantSearch"
android:icon="@drawable/ic_search"
android:title="@string/search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView"
/>
In kotlin file:
private var searchItem : MenuItem? = null
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.search_tenant_menu, menu)
searchItem = menu.findItem(R.id.actionTenantSearch)
val searchView = searchItem?.actionView as SearchView
searchView.setOnQueryTextListener(object :
SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(s: String): Boolean {
CommonUtils.showToast(requireContext(), s)
searchView.clearFocus()
return true
}
override fun onQueryTextChange(s: String): Boolean {
return true
}
})
super.onCreateOptionsMenu(menu, inflater)
}
@vaibhav have you implemented filterable class to your listview or recyclerview. After that call that filterable method in on your search query. You will get appropriate reault Like this
public class Adaptername extends RecyclerView.Adapter<ContactAdapter.MyViewHolder> implements Filterable {
}
CustomFilter filter;
@Override
public Filter getFilter() {
if (filter == null) {
filter = new CustomFilter();
}
return filter;
}
class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// TODO Auto-generated method stub
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
//CONSTARINT TO UPPER
constraint = constraint.toString().toUpperCase();
ArrayList<AllInOnetItem> filters = new ArrayList<AllInOnetItem>();
//get specific items
for (int i = 0; i < filterList.size(); i++) {
if (filterList.get(i).getName().toUpperCase().contains(constraint)) {
AllInOnetItem p = new AllInOnetItem(filterList.get(i).getName(), filterList.get(i).getNumber(),filterList.get(i).getEmail());
filters.add(p);
}
}
results.count = filters.size();
results.values = filters;
} else {
results.count = filterList.size();
results.values = filterList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
// TODO Auto-generated method stub
allInOnetItems = (ArrayList<AllInOnetItem>) results.values;
notifyDataSetChanged();
}
}
I changed the sequence of code lines after that it worked fine.
Before:
super.onCreate(savedInstanceState);
Toolbar toolbar = findViewById(R.id.category1_toolbar);
setSupportActionBar(toolbar);
setContentView(R.layout.activity_product_list);
After:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product_list);
Toolbar toolbar = findViewById(R.id.category1_toolbar);
setSupportActionBar(toolbar);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.