简体   繁体   中英

Android androidx.SearchView is not working

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM