自定义适配器中的错误 "java.lang.String cannot be cast to java.lang.Integer"
Error "java.lang.String cannot be cast to java.lang.Integer" In Custom Adapter
我在微调器中放置提示的自定义适配器有问题。
我制作了一个扩展 ArrayAdapter:
的 class AdapterSpinnerhint
public class AdapterSpinnerHint extends ArrayAdapter {
int labelHint;
int textViewId;
int layout;
ArrayList<String> mItems;
Context context;
public AdapterSpinnerHint(Context context, int spinner_layout, int field, ArrayList<String> list, int label) {
super(context, spinner_layout, list);
textViewId = field;
labelHint = label;
layout = spinner_layout;
mItems=list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(layout, null);
if (position == getCount()) {
((TextView)v.findViewById(textViewId)).setText(labelHint);
((TextView)v.findViewById(textViewId)).setHint((Integer) getItem(getCount())); //"Hint to be displayed"
}
return v;
}
@Override
public int getCount() {
return mItems.size()-1; // you dont display last item. It is used as hint.
}
在我的 activity 中,我创建了一个用于创建微调器的函数
private void createSpinnerCustomer(JSONArray customers) {
Spinner spinner = (Spinner) findViewById(R.id.customers_spinner);
ArrayList<String> customersList=new ArrayList<String>();
for(int i=0;i<customers.length();i++){
try {
customersList.add(customers.getJSONObject(i).getString("name"));
} catch (JSONException e) {
e.printStackTrace();
}
}
customersList.add(String.valueOf(R.string.customer_label));
assert spinner != null;
AdapterSpinnerHint adapter=new AdapterSpinnerHint(
getApplicationContext(), R.layout.spinner_layout, R.id.txt, customersList, R.string.customer_label);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinner.setAdapter(adapter);
spinner.setSelection(adapter.getCount());
}
我将为所有包含提示的微调器创建一个通用适配器。
但是我在这一行的 AdapterSpinnerHint 上收到此错误:
java.lang.ClassCastException: java.lang.String 无法转换为 java.lang.Integer
在您的函数中 - getView 看到这一行 - .setHint((Integer)getItem(getCount()));
.setHint(string) 需要字符串作为参数,您通过将字符串解析为整数来传递整数。
这样做
.setHint(getItem(getCount));
当您在 ArrayAdapter 的构造函数中调用 super 并将字符串列表作为参数传递时,基本上您是在告诉 ArrayAdapter 列表中的对象类型将是 String。所以当你执行 getItem() 时,它将返回一个 String
我改变了方法:
在我的 activity:
private void createSpinnerCustomer(JSONArray customers) {
Spinner spinner = (Spinner) findViewById(R.id.customers_spinner);
AdapterSpinnerHint adapter2 = new AdapterSpinnerHint(ActivityActivity.this, android.R.layout.simple_spinner_dropdown_item, "Customers", customers, "name");
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
assert spinner != null;
spinner.setAdapter(adapter2);
spinner.setSelection(adapter2.getCount());
}
我的适配器:
public class AdapterSpinnerHint extends ArrayAdapter {
String labelHint;
JSONArray mItems;
String property;
public AdapterSpinnerHint(Context context, int spinner_layout, String label, JSONArray list, String getValue) {
super(context, spinner_layout);
labelHint = label;
mItems = list;
property = getValue;
addValue(mItems);
}
private void addValue(JSONArray customers) {
for(int i=0;i<customers.length();i++){
try {
this.add(customers.getJSONObject(i).getString(property));
} catch (JSONException e) {
e.printStackTrace();
}
}
this.add(labelHint);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
if (position == getCount()) {
((TextView)v.findViewById(android.R.id.text1)).setText("");
((TextView)v.findViewById(android.R.id.text1)).setHint((String) getItem(getCount())); //"Hint to be displayed"
}
return v;
}
@Override
public int getCount() {
return super.getCount()-1; // you dont display last item. It is used as hint.
}
}
它有效,但我必须对 setHint((String) getItem(getCount()) 进行强制转换
因为没有它我就无法编译应用程序。
我在微调器中放置提示的自定义适配器有问题。 我制作了一个扩展 ArrayAdapter:
的 class AdapterSpinnerhintpublic class AdapterSpinnerHint extends ArrayAdapter {
int labelHint;
int textViewId;
int layout;
ArrayList<String> mItems;
Context context;
public AdapterSpinnerHint(Context context, int spinner_layout, int field, ArrayList<String> list, int label) {
super(context, spinner_layout, list);
textViewId = field;
labelHint = label;
layout = spinner_layout;
mItems=list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(layout, null);
if (position == getCount()) {
((TextView)v.findViewById(textViewId)).setText(labelHint);
((TextView)v.findViewById(textViewId)).setHint((Integer) getItem(getCount())); //"Hint to be displayed"
}
return v;
}
@Override
public int getCount() {
return mItems.size()-1; // you dont display last item. It is used as hint.
}
在我的 activity 中,我创建了一个用于创建微调器的函数
private void createSpinnerCustomer(JSONArray customers) {
Spinner spinner = (Spinner) findViewById(R.id.customers_spinner);
ArrayList<String> customersList=new ArrayList<String>();
for(int i=0;i<customers.length();i++){
try {
customersList.add(customers.getJSONObject(i).getString("name"));
} catch (JSONException e) {
e.printStackTrace();
}
}
customersList.add(String.valueOf(R.string.customer_label));
assert spinner != null;
AdapterSpinnerHint adapter=new AdapterSpinnerHint(
getApplicationContext(), R.layout.spinner_layout, R.id.txt, customersList, R.string.customer_label);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view,
int pos, long id) {
}
public void onNothingSelected(AdapterView<?> parent) {
}
});
spinner.setAdapter(adapter);
spinner.setSelection(adapter.getCount());
}
我将为所有包含提示的微调器创建一个通用适配器。 但是我在这一行的 AdapterSpinnerHint 上收到此错误:
java.lang.ClassCastException: java.lang.String 无法转换为 java.lang.Integer
在您的函数中 - getView 看到这一行 - .setHint((Integer)getItem(getCount()));
.setHint(string) 需要字符串作为参数,您通过将字符串解析为整数来传递整数。
这样做
.setHint(getItem(getCount));
当您在 ArrayAdapter 的构造函数中调用 super 并将字符串列表作为参数传递时,基本上您是在告诉 ArrayAdapter 列表中的对象类型将是 String。所以当你执行 getItem() 时,它将返回一个 String
我改变了方法: 在我的 activity:
private void createSpinnerCustomer(JSONArray customers) {
Spinner spinner = (Spinner) findViewById(R.id.customers_spinner);
AdapterSpinnerHint adapter2 = new AdapterSpinnerHint(ActivityActivity.this, android.R.layout.simple_spinner_dropdown_item, "Customers", customers, "name");
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
assert spinner != null;
spinner.setAdapter(adapter2);
spinner.setSelection(adapter2.getCount());
}
我的适配器:
public class AdapterSpinnerHint extends ArrayAdapter {
String labelHint;
JSONArray mItems;
String property;
public AdapterSpinnerHint(Context context, int spinner_layout, String label, JSONArray list, String getValue) {
super(context, spinner_layout);
labelHint = label;
mItems = list;
property = getValue;
addValue(mItems);
}
private void addValue(JSONArray customers) {
for(int i=0;i<customers.length();i++){
try {
this.add(customers.getJSONObject(i).getString(property));
} catch (JSONException e) {
e.printStackTrace();
}
}
this.add(labelHint);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
if (position == getCount()) {
((TextView)v.findViewById(android.R.id.text1)).setText("");
((TextView)v.findViewById(android.R.id.text1)).setHint((String) getItem(getCount())); //"Hint to be displayed"
}
return v;
}
@Override
public int getCount() {
return super.getCount()-1; // you dont display last item. It is used as hint.
}
}
它有效,但我必须对 setHint((String) getItem(getCount()) 进行强制转换 因为没有它我就无法编译应用程序。