Android limit the no of items displayed in a spinner's dropdown list

后端 未结 3 710
感动是毒
感动是毒 2020-12-01 21:34

I have a spinner item bound to an array adapter which might have 0 or more items at any time. I want the spinner dropdown list to only show three items at a time, the rest o

相关标签:
3条回答
  • 2020-12-01 21:50

    I was looking at the Spinner source code and it seems like you can't do that with a spinner.

    The Spinner has its own private interface called SpinnerPopup which defines how dropdown items can be shown. This is currently based on the spinnerMode allowing for a dropdown or dialog list.

    Both options are also implemented inside the Spinner class as private classes: DialogPopup and DropdownPopup. Since you can't access them, it seems to me your only options at this point are:

    1. Implement your own custom spinner based on other widgets such as in this example.
    2. Copy the code from the Spinner class which seems pretty self-contained and implement your version of a spinner with it, modifying whatever you like in it.

    I'm sorry I couldn't be of more help.

    Good luck!

    EDIT:

    If you choose option 2, I think all you need to do is add your mode implementing the SpinnerPopup interface. Then inside the constructor Spinner(Context context, AttributeSet attrs, int defStyle, int mode) add another case to the switch checking for the modes to instantiate your own popup. Doesn't seem hard.

    0 讨论(0)
  • 2020-12-01 21:56

    Here's the ultimately simple solution.. just copy this line in Spinner tag...

    android:dropDownHeight="100dp"    <!--change 100dp to your requirement-->
    

    you can also modify width...

    android:dropDownWidth="100dp"   <!--change 100dp to your requirement-->
    

    and you know what it works on AutoCompleteTextView too and with atleast api 16...

    0 讨论(0)
  • 2020-12-01 22:02

    The recommended solutions are not really interesting because they hard code the height of drop down this is bad because font size are actually different in different phones, I handled it dynamic and reliable like this :

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    R.layout.drop_down_text_view,
                    new String[]{"A", "B", "C", "D", "E"}) {
    
                @NonNull
                @Override
                public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
                    TextView dropDownTextView = (TextView) super.getView(position, convertView, parent);
    
                    dropDownTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                        @Override
                        public void onGlobalLayout() {
                            myDropDownMenuOrSpinnerOrAutoCompleteTextView.setDropDownHeight(dropDownTextView.getHeight() * 3);
    
                            dropDownTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        }
                    });
                    return dropDownTextView;
                }
            };
    
    0 讨论(0)
提交回复
热议问题