Android SearchView Filter ListView

前端 未结 4 1286
自闭症患者
自闭症患者 2020-11-27 16:37

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 w

相关标签:
4条回答
  • 2020-11-27 17:09

    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);
    
     }
    
    0 讨论(0)
  • 2020-11-27 17:22

    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;
            }
        });
    
    0 讨论(0)
  • 2020-11-27 17:33

    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;
        }
    }
    
    0 讨论(0)
  • 2020-11-27 17:33

    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

    0 讨论(0)
提交回复
热议问题