android - 为什么在底层游标上调用重新查询后,Android listview 有时会消失?

标签 android listview cursor

我有一个相当简单的应用程序,它使用 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/

相关文章:

Android 通过 DownloadManager 下载文件无法正常工作

java - ListView 无法使用 JavaFX FXML 正确更新

python - 有没有办法在 matplotlib.pyplot.show() 中选择默认鼠标 "mode"作为缩放指针?

css - 将鼠标悬停在按钮上时无法显示光标

Android TextView 中的问号?

Android Multi-AutoComplete-TextView,其中包含不同的文本气泡(芯片)

listview - 通过 ListView / GridView 显示记录

sql - 禁止基于 WHERE 子句的 SELECT 输出

java - Android HTTP 请求编码

android - ListView 不在 android 中的 NestedScrollView 内滚动