Creating a text filter (like quick search) for a Spinner in Android

前端 未结 3 745
星月不相逢
星月不相逢 2020-12-09 11:18

I\'m developing an Android application. I have my activity here with some widgets including a Spinner. I want that Spinner object to be searchable using the quick search but

3条回答
  •  Happy的楠姐
    2020-12-09 11:52

    I know this question is old, but today i also needed this function, and because I wasn´t able to find anything, i made myself a adapter for those spinner

    The Adapter:

    public class Searchspinner extends ArrayAdapter {
        private LayoutInflater inflater;
        private boolean dropdown = false;
        private OnClickListener onsearch;
        private ActionBar ab;
        private final ArrayList result = new ArrayList();
        private InputMethodManager keyboard;
        private boolean searching = false;
        public Searchspinner(Context context, int resource,
                ArrayList objects, LayoutInflater l, ActionBar a,
                InputMethodManager imm, String spinnerid) {
            super(context, resource, objects);
            inflater = l;
            ab = a;
            keyboard = imm; 
            createSearch();
            // TODO Auto-generated constructor stub
        }
        @Override
        public View getDropDownView(int position, View cnvtView, ViewGroup prnt{
            dropdown = true;
            return getCustomView(position, cnvtView, prnt);
        }
        @Override
        public View getView(int pos, View cnvtView, ViewGroup prnt) {
            dropdown = false;
            return getCustomView(pos, cnvtView, prnt);
        }
        public View getCustomView(int position, View convertView, ViewGroup     parent) {
            if (!dropdown) {
                View mySpinner = inflater.inflate(
                        R.layout.spinner_ressource_search, parent, false);
                TextView main_text = (TextView) mySpinner
                        .findViewById(R.id.tv_spinner_first);
                main_text.setText(getItem(position));
                ImageButton search = (ImageButton) mySpinner
                        .findViewById(R.id.searchbutton);
                if (!searching) {
                    search.setImageResource(R.drawable.search);
                } else {
                    search.setImageResource(R.drawable.search_check);
                }
                search.setOnClickListener(onsearch);
                return mySpinner;
            }
            View mySpinner = inflater.inflate(R.layout.auftragtextview, parent,
                    false);
            TextView sub_text = (TextView)  mySpinner.findViewById(R.id.TextView01);
            sub_text.setText(getItem(position));
            return mySpinner;
        }
        private void createSearch() {
            onsearch = new OnClickListener() {
                @Override
                public void onClick(View v) {       
                    // TODO Auto-generated method stub
                    if (searching) {
                        searching = false;
                        ab.setCustomView(R.layout.actionbar_layout);
                        ab.getCustomView().setTag("0");
                        keyboard.toggleSoftInput(0,
                                InputMethodManager.HIDE_IMPLICIT_ONLY);
                        for (int i = 0; i < result.size(); i++) {
                            add(result.get(i));
                            result.remove(i);
                            i--;
                        }
                        ((ImageButton)  v).setImageResource(R.drawable.search);
                        return;
                    }
                    ((ImageButton)  v).setImageResouce(R.drawable.search_check);
                    searching = true;
                    ab.setCustomView(R.layout.searchable);
                    final EditText et = (EditText) ab.getCustomView()
                            .findViewById(R.id.editText1);
                    et.setActivated(true);
                        keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
                            0);
                    et.requestFocus();
                    et.addTextChangedListener(new TextWatcher() {
                        @Override
                        public void onTextChanged(CharSequence s, int start,
                                int before, int count) {
                            for (int i = 0; i < getCount(); i++) {
                                if (!getItem(i).contains(s)) {
                                    result.add(getItem(i));
                                    remove(getItem(i));
                                    i--;
                                }
                            }
                            for (int i = 0; i < result.size(); i++) {
                                if (result.get(i).toLowerCase()
                                            .contains(s.toString().toLowerCase())) {
                                    add(result.get(i));
                                    result.remove(i);
                                    i--;
                                }
                            }
                        }
                        @Override
                        public void beforeTextChanged(CharSequence s,
                                int start, int count, int after) {
                            // TODO Auto-generated method stub
                        }
                        @Override
                        public void afterTextChanged(Editable s) {
                            // TODO Auto-generated method stub
                        }
                    });
                }
            };
        }
    }
    

    The spinner_ressource_search.xml:

    
    
    
    
    
    
    
    

    and the auftragtextview.xml:

    
    
    

    and this is how you create the Adapter:

    Searchspinner auftragSpinnerAdapter = new Searchspinner(
        this.getApplicationContext(),
        R.layout.auftragtextview,
        list_auftragSpinner,getLayoutInflater(),
        getActionBar(),
        (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)
    );  
    

    I hope this is going to help anybody, and that i haven´t missed a already build in way to do this :D
    Greetings

    Edit:

    The searcheble.xml

    
    
     
    

    So the EditText1 is just a simple editText in The View that get´s in the Actionbar when you search.

    The ActionbarLayout is the normal ActionbarView.

提交回复
热议问题