У меня есть довольно простое приложение, которое использует ListActivity для отображения ListView. Каждый элемент ListView имеет флажок, чтобы пользователь мог указать избранные элементы. Я использую класс, расширяющий SimpleCursorAdapter, чтобы я мог фиксировать как событие изменения CheckBox (для сохранения изменения в базе данных), так и событие щелчка по элементу списка (для загрузки действия с подробностями элемента).
После того, как реализация OnCheckChangedListener обновит базу данных, я вызываю .requery () для курсора, чтобы, когда элемент прокручивается, а затем возвращается на экран, CheckBox имеет правильное состояние.
Все работает нормально. Проблемы возникают в другом действии, где я повторно использую тот же макет ListView и тот же адаптер курсора для отображения определенного подмножества элементов как части макета другого действия. Когда я использую там макет, все в порядке, пока я не коснусь CheckBox, после чего весь ListView исчезнет. База данных обновлена, но пока я не выйду из операции и не вернусь, ListView полностью исчезнет.
Если я не вызываю .requery () для курсора, все работает нормально; ListView не исчезает (но состояние CheckBox иногда будет неправильным, как описано выше).
Рабочий макет, event_list.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent" android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:layout_width="wrap_content" android:text="@+id/eventsHeader"
android:id="@+id/eventsHeader" android:gravity="center_vertical"
android:layout_height="wrap_content" android:textSize="15sp" />
<ListView android:id="@+id/android:list" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_below="@+id/showHistoricalEvents" />
<CheckBox android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/showHistoricalEvents"
android:layout_alignParentRight="true" android:layout_alignParentTop="true"
android:text="Show Past Events" android:textSize="14sp" />
<TextView android:id="@+id/android:empty" android:text="@string/no_events"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/showHistoricalEvents" />
</RelativeLayout>
Неработающий макет, track_details.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:orientation="vertical"
android:layout_width="fill_parent">
<TextView android:layout_width="wrap_content" android:id="@+id/InterestLabel"
android:layout_alignParentLeft="true" android:text="@string/interest_level"
android:gravity="center_vertical" android:layout_height="fill_parent"
android:layout_above="@+id/track_name" />
<Spinner android:layout_height="wrap_content" android:id="@+id/InterestSpinner"
android:entries="@array/priority" android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/FavoriteCheckbox" android:layout_width="fill_parent"
android:layout_toRightOf="@+id/InterestLabel" />
<CheckBox android:layout_width="wrap_content" style="?android:attr/starStyle"
android:id="@+id/FavoriteCheckbox" android:layout_alignParentTop="true"
android:layout_alignParentRight="true" android:gravity="center_vertical"
android:layout_height="fill_parent" android:layout_above="@+id/track_name" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/track_name"
android:text="@+id/track_name" android:textSize="25sp"
android:layout_below="@+id/InterestSpinner" />
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_below="@+id/track_name" android:orientation="vertical"
android:layout_height="fill_parent" android:layout_width="fill_parent">
<TextView android:text="@+id/track_description" android:id="@+id/track_description"
android:scrollbars="vertical" android:layout_width="fill_parent"
android:layout_height="0dip" android:layout_weight="1"
android:paddingLeft="5dp" android:paddingTop="5dp" />
<include layout="@layout/event_list" android:id="@+id/trackEventList"
android:layout_width="fill_parent" android:layout_height="0dip"
android:layout_weight="2.5" />
</LinearLayout>
</RelativeLayout>
Сейчас я только подумал, что то, как я использую layout_weight во втором макете, вызывает некоторые странности. Однако я не хочу менять это, поскольку мне потребовалось некоторое время, чтобы заставить макет работать так, как я изначально хотел.
Еще одно замечание: когда я включаю первый макет во второй, я скрываю элементы управления TextView и CheckBox, потому что они не нужны.
Есть идеи, что я здесь делаю не так?
Я испытываю проблемы в другое действие, где я повторно использую тот же макет ListView и тот же адаптер курсора для отображения определенного подмножество предметов как часть другого макет деятельности.
Если вы имеете в виду тот же экземпляр SimpleCursorAdapter
, то это , поэтому не лучшая идея. Сделайте новый адаптер.
Когда я использую там макет, все в порядке, пока я не нажму на CheckBox, после чего весь ListView исчезает. База данных обновлено, но пока я не оставлю активности и вернуться, ListView просто полностью ушел.
Используйте средство просмотра иерархии
, чтобы определить, не имеет ли ListView
дочерних элементов (строк), высоты, невидим / пропал с точки зрения видимости или действительно ли он удален из иерархии представлений. . Это даст вам лучшее представление о том, как действовать дальше.
Есть идеи, что я здесь делаю не так?
Помимо упомянутой выше проблемы с адаптером, вы используете CheckBox
. Android имеет встроенную поддержку списков с множественным выбором (например, android: choiceMode = "multiple"
), но для этого требуется CheckedTextView
. Я бы предпочел использовать встроенную в Android логику множественного выбора, а не использовать собственную.