我发现this workaround用于向下拉式微调器添加提示。它看起来很有前途,但是我没有让我想要的字符串显示在微调器中,而是得到的东西看起来像我的包名(看不到全名)。
@IsaacCisneros创建了新的SpinnerItem和MySpinnerAdapter类。我完全实现了他的新课程。我的实现如下:
ArrayList<SpinnerItem> credValues = new ArrayList<SpinnerItem>();
credValues.add(new SpinnerItem("3.0",false));
credValues.add(new SpinnerItem("Credit", true));
MySpinnerAdapter adapter_cred = new MySpinnerAdapter(this.getActivity(),
android.R.layout.simple_spinner_item, credValues);
adapter_cred.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Spinner spinCred = (Spinner)rootView.findViewById(R.id.cred_spinner);
spinCred.setAdapter(adapter_cred);
spinCred.setSelection(credValues.size() - 1);
他看起来像这样:
ArrayList<SpinnerItem> items = new ArrayList<SpinnerItem>();
items.add(new SpinnerItem("Item 1", false));
items.add(new SpinnerItem("Item 2", false));
items.add(new SpinnerItem("HINT", true)); // Last item
MySpinnerAdapter adapter = new MySpinnerAdapter(this, android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setSelection(items.size() - 1);
那为什么我的表演很怪异?我的代码的上下文是我的活动中的AddItemFragment的onCreateView。我引用的错误是什么?谢谢!
编辑:请求了适配器类代码......
class SpinnerItem {
private final String text;
private final boolean isHint;
public SpinnerItem(String strItem, boolean flag) {
this.isHint = flag;
this.text = strItem;
}
public String getItemString() {
return text;
}
public boolean isHint() {
return isHint;
}
}
class MySpinnerAdapter extends ArrayAdapter<SpinnerItem> {
public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) {
super(context, resource, objects);
}
@Override
public int getCount() {
return super.getCount() - 1; // This makes the trick: do not show last item
}
@Override
public SpinnerItem getItem(int position) {
return super.getItem(position);
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
}
答案 0 :(得分:7)
原因是您没有覆盖适配器的getView()
方法。因此,它使用默认实现,如下所示:
T item = getItem(position);
if (item instanceof CharSequence) {
text.setText((CharSequence)item);
}
else {
text.setText(item.toString());
}
在您的SpinnerItem
中,您没有toString()
方法,因此它使用默认值(您将其视为包名称)
解决此问题的一种方法是向toString()
添加SpinnerItem
方法:
class SpinnerItem {
private final String text;
private final boolean isHint;
public SpinnerItem(String strItem, boolean flag) {
this.isHint = flag;
this.text = strItem;
}
public String getItemString() {
return text;
}
public boolean isHint() {
return isHint;
}
@Override
public String toString() {
return text;
}
}
如果您想要更多控制,例如提示文本等的不同颜色,我建议您自己实施getView()
方法。
答案 1 :(得分:4)
你的适配器可能扩展了android.widget.ArrayAdapter。默认情况下在ArrayAdapter的实现中 - 在android源代码中 - 正如Amulya Khare所说,getView方法,通过
获取文本视图的值T item = getItem(position);
if (item instanceof CharSequence) {
text.setText((CharSequence)item);
}
else {
text.setText(item.toString());
}
默认情况下,每个继承自Object类的类(如SpinneItem类)都会通过toString方法返回包名。所以你可以覆盖SpinnerItem的toString或覆盖MySpinnerAdapter的getView。
答案 2 :(得分:4)
在适配器中,在构造函数中添加这些
private Context mContext;
private int layoutId;
private List<SpinnerItem> dataList;
public MySpinnerAdapter(Context context, int resource, List<SpinnerItem> objects) {
super(context, resource, objects);
this.mContext = context;
this.layoutId = resource;
this.dataList = objects;
}
您需要使用Spinner
和getDropDownView()
在getView()
中设置数据,无需实施getCount()
,getItem()
和getItemId()
,因为在{ {1}}行是ArrayAdapter
调用super
创建的。
constructor