我尝试制作一个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;
}
}
答案 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
}