Android 限制下拉列表中 Spinner 显示的项目数量

14

我有一个绑定到数组适配器的旋转框,它随时可能有0个或多个项目。我希望旋转框下拉列表一次只显示三个项目,其余项目可滚动。 我尝试将旋转框包装在具有固定宽度的布局中,但如果数组适配器中有那么多项,则旋转框下拉列表仍然占用整个屏幕来显示列表。


我认为没有简单的方法可以在不自定义适配器的情况下完成这个任务。但是也许这个链接可以帮到你:https://github.com/ankitthakkar/DropDownSpinner - Ricardo
如何通过自定义适配器完成此操作?我不想像列表中那样使用按钮和列表视图来创建自己的自定义微调控件。 - thunderbird
3个回答

6
我正在查看Spinner的源代码,似乎你无法使用spinner进行此操作。 Spinner有自己的私有接口,称为SpinnerPopup,它定义了如何显示下拉项。这目前基于spinnerMode,允许下拉或对话框列表。
这两个选项也作为私有类在Spinner类中实现:DialogPopupDropdownPopup。由于您无法访问它们,因此在此时您唯一的选择是:
  1. 基于其他小部件(例如this example),实现自己的定制旋转器。
  2. 复制代码Spinner类,它似乎是相当独立的,使用它来实现您自己版本的旋转器,并在其中修改任何您喜欢的内容。

很抱歉我不能提供更多帮助。

祝你好运!

编辑:

如果您选择选项2,我认为您需要做的就是添加实现SpinnerPopup接口的模式。然后在构造函数Spinner(Context context, AttributeSet attrs, int defStyle, int mode)中,添加另一个caseswitch检查模式以实例化自己的弹出窗口。看起来并不难。


我想我会选择第二个选项...听起来更容易! - thunderbird
稍后再回来看结果吧。 :) - Ricardo
你从哪里下载源代码的?我使用了以下链接:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/Spinner.java(后来才意识到这是2009年的源代码)...我删除了几乎所有显示错误的内容,在onClick函数中设置了下拉框对话框的宽度和高度(在Android 1.5中没有弹出窗口),这起到了作用! - thunderbird
酷!我从SDK管理器获取了代码,你可以在那里为不同的API版本下载它。然后你只需要附加它:stackoverflow.com/a/16433131/362298 - Ricardo
你好,请帮忙。我正在使用同一个库,有没有办法在Spinner的onItemClick事件中设置setText? - Anjali Tripathi
_state = state[position]; System.out.println(_state+">>>>>>>>>>>>>");_select_state_btn.setText(_state); - Anjali Tripathi

2

这个答案已经失效了,请寻找其他解决方案。


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...


这是一个非常糟糕的解决方案,因为字体大小在不同的手机上可能会呈现不同的大小,高度不应该被硬编码,考虑使用我的解决方案:https://dev59.com/YWIj5IYBdhLWcg3weE4J#56163333 - alizeyn
3
android:dropDownHeight属性无效。 - philtz
android:dropDownHeight 似乎不被支持。 - Vikas Acharya

0

推荐的解决方案并不是很有趣,因为它们硬编码了下拉菜单的高度,这很糟糕,因为不同手机上的字体大小实际上是不同的。我像这样动态和可靠地处理它:

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;
            }
        };

1
我无法使其工作,因为在任何相关视图类型中都找不到setDropDownHeight方法。你创建了自定义的Spinner类吗? - szaske
@szaske 只需将其设置为您的微调器高度即可。我正在使用具有此方法的autoCompleteTextView。 - alizeyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接