4

我尝试制作一个 Spinner,其中下拉视图中的第一项没有单选按钮。我重写了 arrayadapter 的视图类型,以确保微调器中有两个不同的视图,并且视图不会被错误的项目回收。然后我覆盖 arrayadapter 的 getDropDownView 以从第一项中删除单选按钮。这是有效的,但所选项目不显示单选按钮。我想我不必 setCheckMarkDrawable(android.R.drawable.btn_radio),因为它应该始终存在,但事实并非如此。有任何想法吗?谢谢!

        @Override
        public int getViewTypeCount()
        {
            return 2;
        }

        @Override
        public int getItemViewType(int position)
        {
            if (position == 0)
                return 0;
            else
                return 1;
        }

        @Override
        public View getDropDownView(int position, View convertView, android.view.ViewGroup parent)
        {
            if (position == 0)
            {
                View vw = super.getDropDownView(position, convertView, parent);
                CheckedTextView tv = (CheckedTextView) vw;
                if (tv != null)
                {
                    tv.setCheckMarkDrawable(null);
                    tv.setTextColor(Color.GRAY);
                    return tv;
                }
                return vw;
            } else
            { 
                View vw = super.getDropDownView(position, convertView, parent);
                CheckedTextView tv = (CheckedTextView) vw;
                if (tv != null)
                {
                    tv.setCheckMarkDrawable(android.R.drawable.btn_radio);
                    tv.setTextColor(Color.BLACK);
                    return tv;
                }
                return vw;
            }
        }
4

3 回答 3

3

我也有同样的问题。是的,正如pzagor2所说 - Spinner 不支持下拉列表(getDropDownView)的多布局回收。它只是不调用 getViewTypeCount 和 getItemViewType。这是一个问题 - #17128

但它仍然为 getView 调用这些方法,用于显示当前微调器项目并检测微调器宽度。

解决方法:您可以检查提供的 convertView 是否具有正确的类型,如果不正确则不要使用它。在某些情况下它会有所帮助,例如,当您有两种类型并且一种类型的使用频率低于另一种类型时。

于 2012-11-27T15:56:59.120 回答
0

我认为将 ArrayAdapter 与 Spinner 一起使用时不会调用 getItemViewType 和 getViewTypeCount。一种解决方案是不回收 convertView 并假设它始终为空。但是你会在 LogCat 中得到一个滞后的微调器和大量的 GC 调用。

于 2012-06-28T17:49:52.980 回答
0

由于视图回收不适用于 Spinner,如果您有多个视图,请不要使用 Spinner。而是使用样式为 Spinner 的 TextView,并在 onClick 中打开显示下拉列表的自定义对话框。

<TextView android:id="@+id/labels_spinner"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      style="@style/Base.Widget.AppCompat.Spinner.Underlined"/>


@OnClick(R.id.labels_spinner)
public void onSpinnerClick(View view) {
    // Open dropdown dialog
}
于 2017-07-06T18:30:41.347 回答