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

时间:2010-08-22 19:28:53

标签: android listview cursor

我有一个相当简单的应用程序,它使用ListActivity来显示ListView。每个ListView项都有一个CheckBox,以便用户可以指定喜欢的项。我正在使用一个扩展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控件,因为它们是不必要的。

我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:2)

  

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

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

  

当我在那里使用布局时,   一切都很好,直到我点击   CheckBox,整点   ListView消失了。数据库是   更新,但直到我离开   活动并回来,ListView   刚刚完全消失了。

使用hierarchyviewer确定ListView是否没有子项(行),没有高度,是否从可见性角度看不见/消失,或者是否真正从视图层次结构中删除。这将为您提供更好的如何进行的想法。

  

我在这里做错了什么想法?

除了上面提到的适配器问题,您还在使用CheckBox。 Android内置支持多选列表(例如android:choiceMode="multiple"),但需要CheckedTextView。我的目标是使用Android的内置多选逻辑,而不是自己动手。