0

I am trying to implement searchview in recycleview but that is not working.
No type of error shows, I can't figure out where my mistake is.

This is the search activity which contain recycleview and adapter class. I just create demo to search item in recycleview:

SearchActivity.java

public class New_Search extends AppCompatActivity
{
    private RecyclerView recyclerView;
    DummyAdapter mAdapter;
    List<Lead_Contacts> movieList;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.dummysearch);
        movieList=new ArrayList<>();
        Lead_Contacts contacts = new Lead_Contacts("Mad Max: Fury Road", "Action & Adventure", "29/04/2016");
        movieList.add(contacts);
        contacts= new Lead_Contacts("Inside Out", "Animation, Kids & Family", "29/04/2016");
        movieList.add(contacts);
        contacts = new Lead_Contacts("Star Wars: Episode VII - The Force Awakens", "Action", "29/04/2016");
        movieList.add(contacts);
        contacts= new Lead_Contacts("Shaun the Sheep", "Animation", "29/04/2016");
        movieList.add(contacts);
        contacts= new Lead_Contacts("Shaun the Sheep", "Animation", "29/04/2016");
        movieList.add(contacts);
        contacts= new Lead_Contacts("Shaun the Sheep", "Animation", "29/04/2016");
        movieList.add(contacts);
        contacts= new Lead_Contacts("Shaun the Sheep", "Animation", "29/04/2016");
        movieList.add(contacts);
        movieList.add(contacts);
        recyclerView = (RecyclerView)findViewById(R.id.recycler_view1);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        mAdapter=new DummyAdapter(getApplicationContext(),movieList);
        recyclerView.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();

    }
    public class DummyAdapter  extends RecyclerView.Adapter<DummyAdapter.Customview_holder>
    {
        private Context context;
        private List<Lead_Contacts> listcontacts;
        Lead_Contacts leadcontacts;
        List<Lead_Contacts> leadlist;
        // ClickListener listener;
        public CardView mCardView;
        public DummyAdapter(Context context, List<Lead_Contacts> listcontacts)
        {

            this.context=context;
            this.listcontacts=listcontacts;
        }

        @Override
        public Customview_holder onCreateViewHolder(ViewGroup parent, int viewType)
        {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.seachrecyclelis, parent, false);
            //Customview_holder viewHolder = new Customview_holder(view);
            return new Customview_holder(view);
        }

        @Override
        public void onBindViewHolder(Customview_holder customViewHolder, int position)
        {
            //customViewHolder.mCardView.setTag(position);
            // System.out.println("call binder method");
            Lead_Contacts leadcontacts = listcontacts.get(position);
            customViewHolder.cust_name_textView.setText(leadcontacts.getCustomer_name());
            customViewHolder.eventname_textView.setText(leadcontacts.getEvent_name());
            customViewHolder.date_textView.setText(leadcontacts.getDatetime());

        }


        public int getItemCount()
        {
            return listcontacts.size();
        }

        public void filter(String trim) {
        }


        public class Customview_holder extends RecyclerView.ViewHolder {
            //public View mCardView;
            protected TextView cust_name_textView;
            protected TextView eventname_textView;
            protected TextView date_textView;
            public Customview_holder(View itemView)
            {

                super(itemView);
                // mCardView = (CardView) itemView.findViewById(R.id.cardview);
                // mCardView.setOnClickListener(this);
                System.out.println("call binder method");
                this.cust_name_textView = (TextView)itemView.findViewById(R.id.lead_cust_name);
                this.eventname_textView = (TextView)itemView.findViewById(R.id.lead_eventname);
                this.date_textView = (TextView)itemView.findViewById(R.id.leaddate);
            }

//        public void onClick(View v)
//        {
//            int position = (int) v.getTag();
//            Toast.makeText(v.getContext(),Integer.toString(position), Toast.LENGTH_SHORT).show();
//
//        }
        }
    }
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.lead_search, menu);
        super.onCreateOptionsMenu(menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        //*** setOnQueryTextFocusChangeListener ***
        searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {


            public void onFocusChange(View v, boolean hasFocus)
            {

            }
        });

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

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

            @Override
            public boolean onQueryTextChange(String searchQuery) {
                mAdapter.filter(searchQuery.toString().trim());
                recyclerView.invalidate();
                return true;
            }
        });

        MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                // Do something when collapsed
                return true;  // Return true to collapse action view
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                // Do something when expanded
                return true;  // Return true to expand action view
            }
        });
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_search)
    {

    return true;
}
    return super.onOptionsItemSelected(item);
}

}

This is the menu.xml file which puts the searchview on actionbar:

<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"
          android:icon="@drawable/search"
          android:title="@string/action_search"
          app:actionViewClass="android.support.v7.widget.SearchView"
          app:showAsAction="ifRoom|collapseActionView"
    />

</menu>
Jay Rathod
  • 11,131
  • 6
  • 34
  • 58
sumit
  • 3
  • 4
  • This might help you. http://stackoverflow.com/questions/30398247/how-to-filter-a-recyclerview-with-a-searchview – Ashish Tiwari May 13 '16 at 06:38
  • that is implement in my code....but some kind of little mistake search is not working...plz help – sumit May 13 '16 at 06:45

1 Answers1

0

You forgot to implement your filter method:

    public void filter(String trim) {
    }

First declare a filtered list in your DummyAdapter:

private List<Lead_Contacts> filteredContactList;

Then change the constructor to get a copy of the list:

    public DummyAdapter(Context context, List<Lead_Contacts> listcontacts)
    {

        this.context=context;
        this.listcontacts=listcontacts;
        this.filteredContactList = new ArrayList<>(listcontacts);
    }

Change your getItemCount to return the size of the filtered list:

    public int getItemCount()
    {
        return filteredContactList.size();
    }

Then implement your filter method:

    public void filter(String trim) {
            filteredContactList.clear();
            for (Lead_Contacts contact : listcontacts) {
                if (contact. getCustomer_name().toLowerCase().contains(trim.toLowerCase())) {
                    filteredContactList.add(contact);
                }
            }
    }
Gustavo Pagani
  • 6,583
  • 5
  • 40
  • 71
  • but sir searchview is not working...means code perfect.but i think not work bcz... i have implement navigation drawer(toolbar) which is common for all fragment and search view in 3rd frgament then click on that show 3rd fragment...but search view is also comman for all....mybe thats why not woking....u have any suggestion please how to remove this problem – sumit May 13 '16 at 11:10
  • i implement with diff example with single activity – sumit May 13 '16 at 11:11