为什么Android listview有时会在对基础游标调用requery后消失?

为什么Android listview有时会在对基础游标调用requery后消失?,android,listview,cursor,Android,Listview,Cursor,我有一个相当简单的应用程序,它使用ListActivity来显示ListView。每个ListView项目都有一个复选框,以便用户可以指定喜爱的项目。我正在使用一个扩展SimpleCursorAdapter的类,这样我就可以捕获CheckBox changed事件(将更改保存到数据库)和list item clicked事件(加载item details活动) OnCheckChangedListener实现更新数据库后,我在光标上调用.requery(),这样当项目滚动关闭然后返回屏幕时,复选

我有一个相当简单的应用程序,它使用ListActivity来显示ListView。每个ListView项目都有一个复选框,以便用户可以指定喜爱的项目。我正在使用一个扩展SimpleCursorAdapter的类,这样我就可以捕获CheckBox changed事件(将更改保存到数据库)和list item clicked事件(加载item details活动)

OnCheckChangedListener实现更新数据库后,我在光标上调用.requery(),这样当项目滚动关闭然后返回屏幕时,复选框具有正确的状态

一切正常。我遇到问题的地方是在另一个活动中,我正在重用相同的ListView布局和相同的游标适配器,以将特定的项目子集显示为不同活动布局的一部分。当我在那里使用布局时,一切都很好,直到我点击复选框,此时整个ListView消失。数据库已更新,但在我离开活动并返回之前,ListView已完全消失

如果我不在光标上调用.requery(),一切正常;ListView不会消失(但复选框状态有时会出错,如上所述)

工作布局,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>

我现在唯一的想法是,我在第二个布局中使用布局权重的方式造成了一些奇怪。然而,我不愿意改变这一点,因为我花了相当长的时间才让布局按照我最初希望的方式工作

另一个注意事项是,当我在第二个布局中包含第一个布局时,我隐藏了TextView和CheckBox控件,因为它们是不必要的

你知道我做错了什么吗

我遇到问题的地方是 我正在重复使用的另一项活动 相同的ListView布局和相同的 光标适配器以显示特定的 作为不同项目的一部分的项目子集 活动的布局

如果您指的是
SimpleCursorAdapter
的同一个实例,那么so不是一个好主意。请制作一个新的适配器

当我使用那里的布局时, 在我按下按钮之前,一切都很好 复选框,此时整个 ListView消失了。数据库是 更新,但直到我离开 活动并返回列表视图 完全消失了

使用
hierarchyviewer
确定
ListView
是否没有子级(行)、没有高度、从可见性角度看不可见/消失,或者确实从视图层次结构中删除。这会让你更好地了解如何进行

你知道我做错了什么吗


除了上面提到的适配器问题外,您还使用了
复选框
。Android内置了对多个选择列表的支持(例如,
Android:choiceMode=“multiple”
),但这需要一个
CheckedTextView
。我的目标是使用Android内置的多选逻辑,而不是使用自己的逻辑。

我可能没有正确的行话,但我使用的是基于SimpleCursorAdapter的同一个类,但它不是该类的同一个实例。当我说我在重用它时,我的意思是它只是在两个地方使用相同的类,而不是在两个地方使用相同的实例。感谢hierarchyviewer提示。重新查询后,由于某种原因,列表的高度为0。虽然更改为CheckedTextView可能是一个更好的选择,但在这个版本中,我没有时间转换稍微复杂的列表项。不过,我以后会考虑到这一点。@Malachi:“我使用的是基于SimpleCursorAdapter的同一个类,但它不是该类的同一个实例”——啊,好的,这很好。“在重新查询之后,由于某种原因,列表的高度为0。”--如果高度为
0
,并且列表确实有子元素(行),那么问题出在您的布局中,可能与
android:layout\u weight
有关。实际上,我认为我看到的元素是错误的。列表仍然具有相同的高度,并且仍然可见,但子项已消失。我不是说能见度消失了,它们根本就不存在。我看看我能找出两者的不同之处好吧,我知道了。基本上我过去做过一些太聪明的决定。我重用的活动的原始版本只显示数据,所以我打开然后关闭了dbadapter。正常工作的列表会在dbadapter的实例运行时保持其打开状态。使用关闭的dbadapter进行重新查询时,始终不会返回任何结果。。。嗯。谢谢你的帮助。