每个项目都有不同视图的旋转器

4
我尝试制作一个Spinner,其中下拉视图中的第一项没有单选按钮。我覆盖了ArrayAdapter的ViewTypes,以确保Spinner中有两个不同的视图,并且这些视图不会错误地进行回收。然后我覆盖ArrayAdapter的getDropDownView方法,以从第一项中删除单选按钮。这是有效的,但选择的项目没有显示单选按钮。我认为我不必设置CheckMarkDrawable(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个回答

3
我有同样的问题。是的,就像pzagor2所说的那样 - Spinner不支持下拉列表(getDropDownView)的多布局回收。它只是没有调用getViewTypeCount和getItemViewType。这里有一个问题 - #17128
但是,它仍然调用这些方法来显示当前的Spinner项目并检测Spinner的宽度。
解决方法:您可以检查提供的convertView是否具有正确的类型,并且如果不正确,则不使用它。在某些情况下,例如当您有两种类型时,其中一种类型比另一种类型使用得更少,这将有所帮助。

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
}

0

我认为在使用ArrayAdapter和Spinner时,getItemViewType和getViewTypeCount没有被调用。一种解决方案是不回收convertView并假设它始终为空。但这会导致Spinner卡顿,并且LogCat中会有大量的GC调用。


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