我有一个相当简单的应用程序,它使用 ListActivity 来显示 ListView。每个 ListView 项目都有一个 CheckBox,以便用户可以指定最喜欢的项目。我正在使用一个扩展 SimpleCursorAdapter 的类,这样我就可以捕获 CheckBox 更改事件(将更改保存到数据库)和列表项单击事件(加载项详细信息 Activity )。
在 OnCheckChangedListener 实现更新数据库后,我在光标上调用 .requery() 以便当项目滚动关闭然后返回到屏幕时,CheckBox 具有正确的状态。
一切正常。我遇到问题的地方是在另一个 Activity 中,我重复使用相同的 ListView 布局和相同的光标适配器来显示特定的项目子集作为不同 Activity 布局的一部分。当我在那里使用布局时,一切都很好,直到我点击 CheckBox,此时整个 ListView 消失。数据库已更新,但在我离开 Activity 并回来之前,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 控件,因为它们是不必要的。
知道我在这里做错了什么吗?
最佳答案
Where I am having problems is in another activity where I am reusing the same ListView layout and the same cursor adapter to display a specific subset of items as part of a different activity's layout.
如果您指的是 SimpleCursorAdapter
的同一个实例,那所以不是一个好主意。请制作一个新的适配器。
When I use the layout there, everything is fine until I tap the CheckBox, at which point the entire ListView disappears. The database is updated, but until I leave the activity and come back, the ListView is just totally gone.
使用 hierarchyviewer
确定 ListView
是否没有子项(行)、没有高度、从可见性的角度来看是不可见的/消失的,还是真的从查看层次结构。这将使您更好地了解如何进行。
Any ideas what I am doing wrong here?
除了上面提到的适配器问题,您还在使用CheckBox
。 Android 内置了对多选列表的支持(例如,android:choiceMode="multiple"
),但这需要一个 CheckedTextView
。我的目标是使用 Android 的内置多选逻辑,而不是自己动手。
关于android - 为什么在底层游标上调用重新查询后,Android listview 有时会消失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3542998/