【问题标题】:Android limit the no of items displayed in a spinner's dropdown listAndroid限制微调器下拉列表中显示的项目数量
【发布时间】:2013-11-27 09:30:04
【问题描述】:

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

【问题讨论】:

  • 我认为没有自定义适配器的简单方法可以做到这一点。但也许这会有所帮助:github.com/ankitthakkar/DropDownSpinner
  • 如何通过自定义适配器来做到这一点?我不想像在列表中那样使用按钮和列表视图来制作我自己的自定义微调器项目。

标签: android android-arrayadapter android-spinner


【解决方案1】:

我正在查看Spinner 源代码,您似乎无法使用微调器做到这一点。

Spinner 有自己的私有接口,称为SpinnerPopup,它定义了下拉项的显示方式。这目前基于spinnerMode 允许下拉或对话框列表。

这两个选项也在 Spinner 类中作为私有类实现:DialogPopupDropdownPopup。由于您无法访问它们,因此在我看来,您目前唯一的选择是:

  1. 根据this example 等其他小部件实现您自己的自定义微调器。
  2. Copy the code 来自 Spinner 类,它看起来非常独立,并用它实现你的微调器版本,修改你喜欢的任何内容。

很抱歉,我无法提供更多帮助。

祝你好运!

编辑:

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

【讨论】:

  • 我想我会选择第二个选项..听起来更容易!
  • 稍后返回这里查看结果。 :)
  • 你在哪里下载了源代码?我使用了以下链接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 中没有弹出窗口)!
  • 酷!我从 SDK 管理器获得了代码,您可以在那里下载不同 API 版本的代码。然后你只需要附加它:stackoverflow.com/a/16433131/362298
  • 您好,请帮助..我正在使用相同的库有什么方法可以将 setText 设置为微调器 onItemClick
【解决方案2】:

这个答案已经失效了,请到别处看看。


这是最简单的解决方案.. 只需在 Spinner 中复制这一行 标记...

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

你也可以修改宽度...

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

你也知道它在 AutoCompleteTextView 上的作用 至少 api 16...

【讨论】:

  • 这是一个非常糟糕的解决方案,因为字体大小可以在不同的手机中呈现不同的大小,高度不能被硬编码考虑使用我的解决方案:stackoverflow.com/a/56163333/5629011
  • android:dropDownHeight 没有效果
  • android:dropDownHeight 好像不支持
【解决方案3】:

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

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

【讨论】:

  • 我无法让它工作,因为我在任何类型的相关视图上都找不到 setDropDownHeight 方法。您是否创建了自定义微调器类?
  • @szaske 只需将其设置为您的微调器高度。我正在使用具有此方法的 autoCompleteTextView。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多