Android SearchView Filter ListView-ThrowExceptions

Exception or error:

I have implemented Search Filter to my SearchView in my SherlockAction Bar.

When i type m i want to show filtered results in the list view below which only starts with M and so on. But now it shows random results.

enter image description here
enter image description here

public boolean onQueryTextChange(String newText) {
    Log.i("Nomad", "onQueryTextChange");

    if (TextUtils.isEmpty(newText)) {
        adapter.getFilter().filter("");
        Log.i("Nomad", "onQueryTextChange Empty String");
        placesListView.clearTextFilter();
    } else {
        Log.i("Nomad", "onQueryTextChange " + newText.toString());
        adapter.getFilter().filter(newText.toString());
    }
    return true;
}

public boolean onQueryTextSubmit(String query) {
    Log.i("Nomad", "onQueryTextSubmit");
    return false;
}

public boolean onClose() {
    Log.i("Nomad", "onClose");
    return false;
}
How to solve:

Place this inside your adapter:

@Override
public Filter getFilter(){
   return new Filter(){

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
             constraint = constraint.toString().toLowerCase();
             FilterResults result = new FilterResults();

                if (constraint != null && constraint.toString().length() > 0) {
                  List<String> founded = new ArrayList<String>();
                        for(YourListItemType item: origData){
                            if(item.toString().toLowerCase().contains(constraint)){
                                founded.add(item);
                            }
                    }

                        result.values = founded;
                        result.count = founded.size();
                    }else {
                        result.values = origData;
                        result.count = origData.size();
                    }
            return result;


    }
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
           clear();
           for (String item : (List<String>) results.values) {
                 add(item);
           }
    notifyDataSetChanged();

    }

    }
    }

And this inside constructor of your adapter

public MyAdapter(Context context, int layoutResourceId, String[] places) {
        super(context, layoutResourceId, data);
        this.context = context;

        this.data = Arrays.asList(places);
        this.origData = new ArrayList<String>(this.data);

 }

###

Get the filter from the adapter and filter vy the string changed in the seachview field on query changed.

searchView.setOnQueryTextListener(new OnQueryTextListener() {

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

        @Override
        public boolean onQueryTextChange(String newText) {
            getListAdapter().getFilter().filter(newText);
            return true;
        }
    });

###

Add the element in listview_arr and rest code is below…:-

    listview_arr = new String[listview_array_location.length];
    listview_arr = listview_array;

    setListAdapter(new bsAdapter(this));


    et.addTextChangedListener(new TextWatcher()
    {
        public void afterTextChanged(Editable s)
        {
              // Abstract Method of TextWatcher Interface.
        }
        public void beforeTextChanged(CharSequence s,
                int start, int count, int after)
        {
            // Abstract Method of TextWatcher Interface.
        }
        public void onTextChanged(CharSequence s,int start, int before, int count)
        {
            /*Log.d("count","count==>"+s.length());

                if(((s.length()-temp)%4)==0)
                {
                    Log.d("in if","if in if"+(s.length()-temp));
                    et.setText(et.getText().toString()+" ");
                    int position = et.getText().toString().length();
                    Editable etext = et.getText();
                    Selection.setSelection(etext, position);
                    temp++;
                }*/

            Log.d("count","count==>"+s);
            textlength = et.getText().length();
            array_sort.clear();
            for (int i = 0; i < listview_array_location.length; i++)
            {
                if (textlength <= listview_array_location[i].length())
                {
                    if(et.getText().toString().equalsIgnoreCase((String)listview_array_location[i].subSequence(0,textlength)))
                    {
                        array_sort.add(listview_array[i]);
                    }
                  }
            }
            AppendList(array_sort);
        }
    });
}

public void AppendList(ArrayList<String> str)
{
    listview_arr = new String[str.size()];
    listview_arr = str.toArray(listview_arr);

    setListAdapter(new bsAdapter(this));
}

public class bsAdapter extends BaseAdapter
{
    Activity cntx;
    public bsAdapter(Activity context)
    {
        // TODO Auto-generated constructor stub
        this.cntx=context;

    }

    public int getCount()
    {
        // TODO Auto-generated method stub
        return listview_arr.length;
    }

    public Object getItem(int position)
    {
        // TODO Auto-generated method stub
        return listview_arr[position];
    }

    public long getItemId(int position)
    {
        // TODO Auto-generated method stub
        return listview_array.length;
    }

    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View row=null;

        LayoutInflater inflater=cntx.getLayoutInflater();
        row=inflater.inflate(R.layout.search_list_item, null);

        TextView tv=(TextView)row.findViewById(R.id.title);
        Button Btn01=(Button)row.findViewById(R.id.Btn01);
        Button Btn02=(Button)row.findViewById(R.id.Btn02);

        tv.setText(listview_arr[position]);

        Btn01.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
                Toast.makeText(SearchUser.this, "Button 1 "+listview_arr[position], Toast.LENGTH_SHORT).show();
                  int color = PreferenceManager.getDefaultSharedPreferences(
                          SearchUser.this).getInt(COLOR_PREFERENCE_KEY, Color.WHITE);
                  new ColorPickerDialog(SearchUser.this, SearchUser.this, color).show();
            }
         });

        Btn02.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v) 
            {
                Toast.makeText(SearchUser.this, "Button 2 "+listview_arr[position], Toast.LENGTH_SHORT).show();
            }
         });

    return row;
    }
}

###

you can simply go through this example. it is very easy to integrate in your application

Here is the logic with array and addTextChangedListener for EditText

Leave a Reply

Your email address will not be published. Required fields are marked *