Должен ли конструктор SimpleCursorAdapter соблюдать порядок столбцов в конструкторе?

Я тестирую базовый запрос SQLite и использую SimpleCursorAdapter для заполнения ListView, содержащего LinearLayout, которые содержат TextViews данных столбца, но когда я изменяю порядок TextView, данные в TextView перемещаются с порядком, а не с R. я бы.

В приведенном ниже примере порядок элементов 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>

person troutit    schedule 08.09.2014    source источник


Ответы (1)


Представления, которые должны отображать столбец в параметре "от". Все они должны быть TextViews. Первым N представлениям в этом списке присваиваются значения первых N столбцов в параметре from.

Источник

Попробуйте очистить проект и запустить его снова.

Я предполагаю, что значения R.id в вашем файле R.java не соответствуют значениям в скомпилированном коде Java. Это вполне возможно, если вы изменили только файлы XML. R.java будет перегенерирован, но классы, использующие R.id, не будут перекомпилированы с новыми значениями. Поскольку R.id содержит final констант, компилятор может оптимизировать байтовый код, используя значение константы напрямую, а не загружая его из переменной. Это напрямую вызывает проблему, которую вы видите, когда R.java изменяется, но остальная часть вашего кода не перекомпилируется.

person Code-Apprentice    schedule 08.09.2014
comment
Черт, это сделало это. Так будет ли это специфично для Eclipse/ADT или связано с инструментами сборки SDK? - person troutit; 09.09.2014
comment
@troutit Такое поведение можно увидеть с помощью любого инструмента сборки, который не знает, что ваш код Java зависит от R.java. Если инструмент сборки не знает, как пересобрать ваш код при изменении R.java, вы столкнетесь с подобными проблемами. - person Code-Apprentice; 09.09.2014