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;
}