Android 自定义微调器适配器

Android 自定义微调器适配器,android,Android,我想在微调器上应用自定义字体。我发现的唯一方法是创建一个自定义适配器。这是我的密码 private class CustomAdapter extends ArrayAdapter { private Context context; private List<CharSequence> itemList; public CustomAdapter(Context context, int textViewResourceId,List<Cha

我想在微调器上应用自定义字体。我发现的唯一方法是创建一个自定义适配器。这是我的密码

    private class CustomAdapter extends ArrayAdapter {

    private Context context;
    private List<CharSequence> itemList;
    public CustomAdapter(Context context, int textViewResourceId,List<CharSequence> itemList) {

        super(context, textViewResourceId);
        this.context=context;
        this.itemList=itemList;
    }

    public TextView getView(int position, View convertView, ViewGroup parent) {

        TextView v = (TextView) super
                .getView(position, convertView, parent);
        Typeface myTypeFace = Typeface.createFromAsset(context.getAssets(),
                "fonts/gilsanslight.otf");
        v.setTypeface(myTypeFace);
        v.setText(itemList.get(position));
        return v;
    }

    public TextView getDropDownView(int position, View convertView,
            ViewGroup parent) {

        TextView v = (TextView) super
                .getView(position, convertView, parent);
        Typeface myTypeFace = Typeface.createFromAsset(context.getAssets(),
                "fonts/gilsanslight.otf");
        v.setTypeface(myTypeFace);
        v.setText(itemList.get(position));
        return v;
    }

}
私有类CustomAdapter扩展了ArrayAdapter{
私人语境;
私人清单项目清单;
公共CustomAdapter(上下文上下文、int textViewResourceId、列表项列表){
super(上下文,textViewResourceId);
this.context=context;
this.itemList=itemList;
}
公共文本视图getView(int位置、视图转换视图、视图组父级){
TextView v=(TextView)超级
.getView(位置、转换视图、父级);
Typeface myTypeFace=Typeface.createFromAsset(context.getAssets(),
“fonts/gilsantlight.otf”);
v、 设置字体(myTypeFace);
v、 setText(itemList.get(position));
返回v;
}
公共文本视图getDropDownView(int位置,视图转换视图,
视图组(父级){
TextView v=(TextView)超级
.getView(位置、转换视图、父级);
Typeface myTypeFace=Typeface.createFromAsset(context.getAssets(),
“fonts/gilsantlight.otf”);
v、 设置字体(myTypeFace);
v、 setText(itemList.get(position));
返回v;
}
}
然后我用

List<CharSequence> itemList = new ArrayList<CharSequence>(
            Arrays.asList(items));

    mySpinnerArrayAdapter = new   CustomAdapter(context,android.R.layout.simple_spinner_item,itemList); 
    spinner.setAdapter(mySpinnerArrayAdapter);
List itemList=new ArrayList(
数组。asList(items));
mySpinnerArrayAdapter=新的CustomAdapter(上下文,android.R.layout.simple\u微调器\u项目,项目列表);
spinner.setAdapter(myspinnerrayadapter);
执行此操作后,我的适配器为空。有人能帮我吗?这些项目包含一个国家列表

亲切问候,

试试看
试试这个

在布局文件中:

<Spinner
     android:id="@+id/spinnerview"
     android:layout_width="180dp"
     android:layout_height="42dp"
     android:layout_marginLeft="105dp"
     android:layout_marginTop="45dp"
     android:background="@drawable/spinner_back"
     android:paddingLeft="5dp"
     android:spinnerMode="dropdown"
     android:visibility="visible" />
在Java文件内部,使用
onCreate()
方法:

spinner_environment = (Spinner) findViewById(R.id.spinnerview);
            adapter = ArrayAdapter.createFromResource(this,
                    R.array.spinner_array_environtment, R.layout.spinner);
            adapter.setDropDownViewResource(R.layout.spinner);
            spinner_environment.setAdapter(adapter);
将新的
spinner.xml
文件放入布局文件夹:

内部
spinner.xml
文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinnerTarget"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="25dp"
    android:textColor="#4C4646" />

就这样

最简单的,我想:)

List listOfItems=getListOfItems();//返回ArrayList
ArrayAdapter spinnerAdapter=新的ArrayAdapter(这是android.R.layout.simple\u spinner\u项,列表项);
targetSpinner.setAdapter(spinnerAdapter);
好的,简单地将字符串列表放在微调器中不应该强迫我们实现适配器。我认为这是一个代码污点,并且有点模式疯狂


诀窍是简单的\u微调器\u项id-该死,我喜欢R.id机制,但从文档中看这并不直观。

在超级类构造函数中将itemList作为参数传递

public CustomAdapter(Context context, int textViewResourceId,List<CharSequence> itemList) {

    super(context, textViewResourceId, itemList);
    this.context=context;
    this.itemList=itemList;
}
公共CustomAdapter(上下文上下文、int textViewResourceId、列表项列表){ super(上下文、textViewResourceId、itemList); this.context=context; this.itemList=itemList; } 这对我很有效(使用android.R.layout.简单的微调器下拉菜单项)


我认为这是一个更好的解决方案,因为您不需要多次充气。

您只需在构造器中获得一次充气器,然后再重新使用。有没有办法不用使用自定义适配器就可以做到这一点,但是改用setDropDownResource?我还建议对convertview进行检查,并且仅当convertview==null时才进行膨胀,因为为了效率起见,ArrayAdapters在内部就是这样做的。两者的参数是相同的,也是主体。那么,为什么不从getView调用getDropDownView呢?还是维切维萨?谢谢
getDropDownView()
。奇怪,但是很多教程都跳过了这个方法。在我的例子中,当spinner展开时,它显示的是item.toString(),而不是项中的字符串(字段)。A同意@ValMartinez,您可以重构代码并提取创建
TextView
的方法,甚至从
getDropDownView()
调用
getView()
。实际上,简单的微调器下拉项已经膨胀了多次,所以为什么不膨胀您的自定义视图呢。。。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinnerTarget"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="25dp"
    android:textColor="#4C4646" />
List<String> listOfItems = getListOfItems(); // returns ArrayList<String>

ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, listOfItems);

targetSpinner.setAdapter(spinnerAdapter);
public CustomAdapter(Context context, int textViewResourceId,List<CharSequence> itemList) {

    super(context, textViewResourceId, itemList);
    this.context=context;
    this.itemList=itemList;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    CheckedTextView checkedTextView = (CheckedTextView) super.getView(position, convertView, parent);
    checkedTextView.setText(itemList.get(position));
    return checkedTextView;
}