继续在错误之间反弹,找不到Spinner / Adapter的良好修复

时间:2012-06-05 09:39:38

标签: android simplecursoradapter android-spinner

我似乎无法弄清楚这个SimpleCursorAdapter,每次我修复一个错误,另一个弹出,如果我按照步骤修复那个,第一个再次出现。我觉得我在这里进行圈子,所以这里是我正在尝试调试的代码块,注意,第一部分只是创建数据库,但我认为任何可能有助于搞清楚。

        SQLiteDatabase rpgDB = null;
        String classFields = " (classID, className, classHP)";

        try {
            rpgDB = this.openOrCreateDatabase("RpgDB", MODE_PRIVATE, null);
            rpgDB.execSQL("DROP TABLE IF EXISTS " + classTable);

            rpgDB.execSQL("CREATE TABLE IF NOT EXISTS " + classTable + " (classID INT(3), className TEXT, classHP INT(4));");
            rpgDB.execSQL("INSERT INTO " + classTable + classFields + " VALUES (1, 'Warrior', 10);");
            rpgDB.execSQL("INSERT INTO " + classTable + classFields + " VALUES (2, 'Rogue', 7);");
            rpgDB.execSQL("INSERT INTO " + classTable + classFields + " VALUES (3, 'Mage', 5);");


            String query = "SELECT className AS _id FROM " + classTable;
            Cursor cursor = rpgDB.rawQuery(query, null);
            rpgDB.close();

            int[] to = new int[] { R.id.classDropDown };
            String[] spinnerFields = new String[] { "_id" };
            /**
             * Test code to check value of cursor
             */ 
            int count = cursor.getCount();
            cursor.moveToFirst();
            while (cursor.isAfterLast() == false) 
            {
                String test  = cursor.getString(0);
                cursor.moveToNext();
            }

            SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.main, cursor, spinnerFields, to);
            int cursorcount = cursorAdapter.getCount();
            // cursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            Spinner classDropDown = (Spinner) this.findViewById(R.id.classDropDown);
            classDropDown.setAdapter(cursorAdapter);
        } catch (Exception ex) {
            System.out.println("Exception: " + ex);
        }

从SimpleCursorAdapter填充Spinner似乎非常麻烦。

编辑:此代码的错误是

Invalid statement in fill window

如果我注释掉rpgDB.close()行

Spinner is not a view that can be bounds by this SimpleCursorAdapter

如果我将select语句和spinnerfields更改为(注释掉DB):

String query = "SELECT className FROM " + classTable;
String[] spinnerFields = new String[] { "className" };

我明白了:

column '_id' does not exist

EDIT XML:这是main.xml(也是id main)XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@color/white" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:textSize="11pt"
        android:text="@string/hello"
        android:textColor="@color/baseTextColor" />

    <Spinner
        android:id="@+id/classDropDown"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>

解释:所以,如果有人在将来遇到这个问题,感谢Luksprog,我对此有所了解(他向我展示了修复):

android.R.id和android.R.layout“ids / layouts”是Android组件的默认xml布局,例如TextField和Spinner“list”布局。 Spinner对象基本上不完整。您需要另一个XML部分来定义列表本身的外观以及另一个行(text1是默认的android TextField)。

简而言之,将“to”字段分配给TextField或使用默认的Android字段之一,如android.id.text1,但为了使用它,我相信你还必须使用CONTAINS的布局默认的android字段,andoid.R.layout(在我的例子中,simple_spinner_item)。最后,将dropdownresource设置为您自己的xml或android默认值(我的是android.R.layout.simple_spinner_dropdown_item)。

1 个答案:

答案 0 :(得分:1)

检查一下:

String query = "SELECT _id, className FROM " + classTable;
Cursor cursor = rpgDB.rawQuery(query, null);
int[] to = new int[] { android.R.id.text1 };
String[] spinnerFields = new String[] { "className"};
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner, cursor, spinnerFields, to);
cursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
Spinner classDropDown = (Spinner) this.findViewById(R.id.classDropDown);
classDropDown.setAdapter(cursorAdapter);
  

填充窗口中的语句无效

如果要从Cursor中提取数据,则无法关闭数据库连接。

  

Spinner不是可由此SimpleCursorAdapter

绑定的视图

to int数组表示行布局文件中Views的id,您传递给SimpleCursorAdapter以绑定from数组中的数据{{1} 1}},我希望你有一个布局文件,只需传递活动的布局)。您在那里使用的标识R.layout.main表示R.id.classDropDown视图,而Spinner不知道如何将数据绑定到该标识(它可以将数据绑定到SimpleCursorAdapter或{ {1}})。如果你想在每一行上TextView(你真的想要这个吗?或者你想要默认的微调器行布局?)然后使用自定义适配器或ImageView

  

列'_id'不存在

因为表Spinner中没有此名称的列。此列应声明为:

SimpleCursorAdapter.ViewBinder

也许您可以classTable查看INTEGER PRIMARY KEY AUTOINCREMENT