【问题标题】:Is SimpleCursorAdapter constructor supposed to observe column order in constructor?SimpleCursorAdapter 构造函数是否应该观察构造函数中的列顺序?
【发布时间】:2014-09-08 07:18:48
【问题描述】:

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

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

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

这是正常行为吗?我希望 SimpleCursorAdapter 'from' 列在构造函数中按照它们各自的顺序填充 'to' 视图。

示例代码:

    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>

【问题讨论】:

    标签: android sqlite listview simplecursoradapter


    【解决方案1】:

    应该在“from”参数中显示列的视图。这些都应该是 TextViews。此列表中的前 N ​​个视图被赋予 from 参数中前 N 列的值。

    Source

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

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

    【讨论】:

    • 该死,做到了。那么这会是 Eclipse/ADT 特有的东西,还是与 SDK 构建工具有关?
    • @troutit 任何不知道您的 Java 代码依赖于R.java 的构建工具都可能看到这种行为。如果在R.java 更改时构建工具不知道要重新构建您的代码,您将看到这类问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2019-05-12
    • 1970-01-01
    • 2012-06-30
    相关资源
    最近更新 更多