Search code examples
androidlistviewsearchcustom-lists

Android Search option is not working?


android Search function in Custom list view is not working. RestListModel is my model name.

  1. this is my code on ManActivity:
import android.support.v7.widget.SearchView;

    private List<RestListModel> rdataList;
    private ListView listView;
    private CustomListAdapter adapter;
    SearchView search;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.quick_list);
        rdataList = new ArrayList<RestListModel>();
        listView = (ListView) findViewById(R.id.rrlist);
        adapter = new CustomListAdapter(this, rdataList);
        listView.setAdapter(adapter);
        listView.setTextFilterEnabled(true);
   }
   // on create finished here

   public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menutosearch, menu);

        final MenuItem myActionMenuItem = menu.findItem(R.id.action_search);

        search = (SearchView) myActionMenuItem.getActionView();

        //*** setOnQueryTextListener ***
        search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                // TODO Auto-generated method stub

                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                // TODO Auto-generated method stub
                adapter.filter(newText);
                return false;
            }
        });
        return true;
    }
  1. ADAPTER CLASS:
    public class CustomListAdapter extends BaseAdapter {
        private Activity activity;
        private LayoutInflater inflater;
        private List<RestListModel> rItems=null;
        private ArrayList<RestListModel> arraylist;

        public CustomListAdapter(Activity activity, List<RestListModel> restItems) {
            this.activity = activity;
            this.rItems = restItems;
            this.arraylist = new ArrayList<RestListModel>();
            this.arraylist.addAll(rItems);
        }

        /// I think something is wrong here



        @Override
        public int getCount() {
            return rItems.size();

        }

        @Override
        public Object getItem(int location) {
            return rItems.get(location);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }



        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            convertView.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {

                }
            });

            return convertView;
        }

        //  this is the actually filter Filter method.
        public void filter(String charText) {
            charText = charText.toLowerCase(Locale.getDefault());
            rItems.clear();
            if (charText.length() == 0) {
                rItems.addAll(arraylist);
            } else {
                for (RestListModel wp : arraylist) {
                    if (wp.getName().toLowerCase(Locale.getDefault())
                            .contains(charText)) {
                        rItems.add(wp);
                    }
                }
            }
            notifyDataSetChanged();
        }
    }

Solution

  • Change CustomListAdapter like this:

    public class CustomListAdapter extends BaseAdapter {
        ...
    
        public CustomListAdapter(Activity activity, List<Movie> movieItems) {
            this.activity = activity;
            this.movieItems= new ArrayList<>(movieItems);
            this.arraylist = new ArrayList<>(movieItems);
        }
    
        ...
    
        public void add(Movie movie) {
            movieItems.add(movie);
            arraylist.add(movie);
        }
    }
    

    And add like this:

     public void onResponse(JSONArray response) {
        ...
           // adding movie to movies array
           adapter.add(movie);
        ...
     }