5

我正在使用此示例代码来填充 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。微调器文本消失了。

    // 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的快照: 在此处输入图像描述

有什么我可能会错过的吗?

4

3 回答 3

3

好的,发生的事情是,当您调用时,setDropDownViewResource您正在替换之前在构造函数中指定的布局。在你的情况下R.layout.profile_colorSimpleCursorAdapterextendsResourceCursorAdapter并在构造函数中将两个布局设置为彼此相等。

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; 但是,对于您要达到的简单结果,这可能是矫枉过正。

于 2010-06-19T04:35:19.917 回答
2

很重要!我差点把头发扯掉,试图弄清楚为什么我的代码不起作用。对于那些可能正在阅读本文并且您的代码仍然无法正常工作的人,如果您正在使用其他android布局(例如作为 android.R.layout.simple_spinner_dropdown_item)。如果整数数组 textview 不包含在您正在使用的指定布局中,则该代码将不起作用。在调试我的代码时,我改变了很多东西,却忘记了确保它们匹配。因此,如果您定义自己的布局,请确保使用该布局中的 textview。

于 2011-04-25T19:58:54.470 回答
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);

替代文字

但是现在如果我先从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);

非常感谢你的帮助。

于 2010-06-19T13:00:49.117 回答