SimpleCursorAdapter构造函数是否应该在构造函数中观察列顺序?

时间:2014-09-08 07:18:48

标签: android sqlite listview simplecursoradapter

我正在测试一个基本的SQLite查询,并使用SimpleCursorAdapter来填充包含列数据的TextViews的LinearLayout的ListView,但是当我更改TextView的顺序时,TextView中的数据随订单移动,而不是R.id。

在下面的示例中,TextView的顺序是@ + id / rowid和@ + id / name,并且光标中的数据正确填充。

但是,如果我修改row.xml以更改EditText的顺序(我剪切整个TextView元素并将其粘贴到另一个TextView的另一侧),则光标中的数据保持相同的顺序,即。游标中的DatabaseHelper.NAME数据进入@ + id / rowid EditText,游标中的_id数据进入@ + id / name

这是正常行为吗?我期望SimpleCursorAdapter'从'列在构造函数中以各自的顺序填充'到'视图。

示例代码:

    Cursor usersCursor;
    String query = String.format("SELECT _id, %s FROM %s",
            DatabaseHelper.NAME, DatabaseHelper.TABLE);
    cursor = db.getReadableDatabase().rawQuery(query, null);

    usersCursorAdapter = new SimpleCursorAdapter(getActivity(),
            R.layout.row, usersCursor,
            new String[] { "_id", DatabaseHelper.NAME }, 
            new int[] { R.id.rowid, R.id.name },
            0);

    userList.setAdapter(usersCursorAdapter);

和R.layout.row.xml是:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
      android:id="@+id/rowid"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="16dp"
      android:layout_marginRight="16dp" />

    <TextView
      android:id="@+id/name"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_margin="4dp"
      android:textSize="36sp" />

</LinearLayout>

1 个答案:

答案 0 :(得分:1)

  

应该在&#34; from&#34;中显示列的视图参数。这些都应该是TextViews。此列表中的前N个视图将给出from参数中前N列的值。

Source

尝试清理项目并再次运行。

我的猜测是R.id文件中的R.java值与编译的Java代码中的值不匹配。如果您只更改了XML文件,这是完全可能的。将重新生成R.java,但使用R.id的类不会使用新值重新编译。由于R.id包含final常量,编译器可以通过直接使用常量值来优化字节代码,而不是从变量中加载它。这会直接导致R.java更改时遇到的问题,但不会重新编译其余代码。