我正在使用此示例代码填充Spinner。从数据库中读取数据。选择正确显示 - 在这种情况下,它显示“绿色”和“红色”。
Spinner spinnerColor = (Spinner) findViewById(R.id.spinnertProfile);
mProfileDbHelper = new ProfileDbAdapter(this);
mProfileDbHelper.open();
Cursor profilesCursor = mProfileDbHelper.fetchAllProfiles();
startManagingCursor(profilesCursor);
// Create an array to specify the fields we want to display in the list
String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };
// and an array of the fields we want to bind those fields to
int[] to = new int[] { R.id.textviewColors };
// Now create a simple cursor adapter and set it to display
SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
R.layout.profile_color, profilesCursor, from,
to);
spinnerColor.setAdapter(profilesAdapter);
}
然而,当我改为使用不同的布局 android.R.layout.simple_spinner_dropdown_item 时。 Spinner Text消失了。
// Now create a simple cursor adapter and set it to display
SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
R.layout.profile_color, profilesCursor, from,
to);
profilesAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerColor.setAdapter(profilesAdapter);
在下方查看不使用和使用 simple_spinner_dropdown_item 的快照:
我可能会错过什么?
答案 0 :(得分:3)
好的,正在发生的事情是当你调用setDropDownViewResource
时,你正在替换之前在构造函数中指定的布局。在您的情况下R.layout.profile_color
。 SimpleCursorAdapter
扩展ResourceCursorAdapter
并在构造函数中设置两个布局彼此相等。
public ResourceCursorAdapter(Context context, int layout,
Cursor c, boolean autoRequery) {
super(context, c, autoRequery);
mLayout = mDropDownLayout = layout;
mInflater = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
当您致电setDropDownViewResource
并更改下拉列表时,会出现此问题。 SimpleCursorAdapter
将继续使用您在构造函数中指定的相同资源ID绑定。
您应该做的只是在SimpleCursorAdapter
的构造函数中指定布局。我建议您将代码更改为:
String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };
int[] to = new int[] { android.R.id.text1 }; // from simple_spinner_dropdown_item
SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_dropdown_item, profilesCursor, from, to);
spinnerColor.setAdapter(profilesAdapter);
获得您想要的结果。
基本上不要使用setDropDownViewResource
方法。或者,如果您这样做,并且您更改了资源ID绑定,则必须调用SimpleCursorAdapter#changeCursorAndColumns
;但是,对于你想要达到的简单结果来说,这可能是过度的。
答案 1 :(得分:2)
非常重要!我差点把我的头发弄掉,试图找出为什么我的代码不起作用。对于那些可能正在阅读此内容并且您的代码仍无法正常工作的人,请确保int [] to = new int [] { android.R.id.text1 }如果您是使用其他android布局(例如android.R.layout.simple_spinner_dropdown_item)。如果整数数组textview未包含在您正在使用的指定布局中,则代码将不起作用。在调试我的代码时,我改变了很多东西,忘了确保这些匹配。因此,如果您定义自己的布局,请确保使用该布局中的文本视图。
答案 2 :(得分:0)
Qberticus,
是的,您对资源ID绑定是对的!!
但是,如果我从 android.R.layout.simple_spinner_dropdown_item 开始,显然下拉布局会显示,但它不漂亮: - )
String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };
int[] to = new int[] { android.R.id.text1 }; // from simple_spinner_dropdown_item
SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_dropdown_item, profilesCursor, from, to);
spinnerColor.setAdapter(profilesAdapter);
alt text http://www.freeimagehosting.net/uploads/c2647bd57d.gif
但现在如果我首先使用 simple_spinner_item ,然后setDropDownViewResource
开始 simple_spinner_dropdown item ,它现在会显示我正在寻找的内容。
String[] from = new String[] { ProfileDbAdapter.COL_PROFILE_TITLE };
int[] to = new int[] { android.R.id.text1 }; // from simple_spinner_dropdown_item
SimpleCursorAdapter profilesAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_spinner_item, profilesCursor, from, to);
profilesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerColor.setAdapter(profilesAdapter);
非常感谢你的帮助。