每个项目具有不同视图的微调器

时间:2012-06-04 17:47:36

标签: android spinner

我尝试制作一个Spinner,其中dropdownview中的第一项没有单选按钮。我重写了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;
            }
        }

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

我认为在使用带有Spinner的ArrayAdapter时,不会调用getItemViewType和getViewTypeCount。一种解决方案是不回收convertView并假设它始终为null。但是你在LogCat中得到了一个滞后的微调器和很多GC调用。

答案 2 :(得分: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
}