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

前端 未结 3 727
星月不相逢
星月不相逢 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条回答
  • 2020-12-09 11:30

    You can implement it by your self.

    Use a button instead of spinner, design a dialog with an EditText for query input and a ListView for content of you want to display. Then filter the content of ListView according to what user is entered in EditText.

    filter(list, text);
    adapter.notifyDataSetChanged(); 
    
    0 讨论(0)
  • 2020-12-09 11:40

    Looks like you are talking about similar functionality given in AutoCompleteTextView

    0 讨论(0)
  • 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<String> {
        private LayoutInflater inflater;
        private boolean dropdown = false;
        private OnClickListener onsearch;
        private ActionBar ab;
        private final ArrayList<String> result = new ArrayList<String>();
        private InputMethodManager keyboard;
        private boolean searching = false;
        public Searchspinner(Context context, int resource,
                ArrayList<String> 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:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
    
    <TextView
        android:id="@+id/tv_spinner_first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="TextView" />
    
    <ImageButton
        android:id="@+id/searchbutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@android:color/transparent"
        android:src="@drawable/search" />
    
    </RelativeLayout>
    

    and the auftragtextview.xml:

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/TextView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@+d/TextView01"
        android:textSize="16sp" >
    </TextView>
    

    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

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:background="@drawable/actionbar_background_beosys" >
    <EditText
        android:id="@+id/editText1"
        android:hint="@string/suche"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_marginLeft="15dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:layout_marginRight="15dp"
        android:singleLine="true"
      /> 
    

    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.

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