问题标签 [android-cursoradapter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
744 浏览

android - 错误:使用 CursorAdapter 从列表的 onItemClick 启动活动

我正在尝试构建一个联系人应用程序

在主要活动中,我显示所有联系人的列表。

但是,当我在单击列表中的项目后尝试启动活动时,出现错误:

致命异常:main 01-20 09:54:48.407: E/AndroidRuntime(8459): java.lang.IllegalStateException: 这应该只在游标有效时调用

似乎适配器方法(getView,getCount)以某种方式不断调用

我的代码如下,

这是日志:

01-20 09:54:48.407: E/AndroidRuntime(8459): FATAL EXCEPTION: main 01-20 09:54:48.407: E/AndroidRuntime(8459): java.lang.IllegalStateException: 这应该只在光标时调用有效 01-20 09:54:48.407: E/AndroidRuntime(8459): at android.widget.CursorAdapter.getView(CursorAdapter.java:175) 01-20 09:54:48.407: E/AndroidRuntime(8459): at android.widget.AbsListView.obtainView(AbsListView.java:1409) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.widget.ListView.measureHeightOfChildren(ListView.java:1307) 01-20 09: 54:48.407: E/AndroidRuntime(8459): 在 android.widget.ListView.onMeasure(ListView.java:1127) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.view.View.measure (View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.widget.RelativeLayout.measureChild(RelativeLayout.java:566) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381) 01-20 09:54:48.407: E/AndroidRuntime(8459) : 在 android.view.View.measure(View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.widget.RelativeLayout.measureChildHorizo​​ntal(RelativeLayout.java:581) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.view.View .measure(View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202) 01-20 09:54:48.407: E /AndroidRuntime(8459): 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 01-20 09:54:48.407: E/AndroidRuntime(8459):在 android.view.View.measure(View.java:8510) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3202) 01-20 09 :54:48.407: E/AndroidRuntime(8459): 在 android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.view.View。测量(View.java:8510)01-20 09:54:48.407:E/AndroidRuntime(8459):在 android.view.ViewRoot.performTraversals(ViewRoot.java:871)01-20 09:54:48.407:E/ AndroidRuntime(8459): 在 android.view.ViewRoot.handleMessage(ViewRoot.java:1921) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.os.Handler.dispatchMessage(Handler.java:99 ) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android.os.Looper.loop(Looper.java:143) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 android .app.ActivityThread.main(ActivityThread.java:4196) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 java.lang.reflect.Method.invokeNative(Native Method) 01-20 09:54:48.407 : E/AndroidRuntime(8459): at java.lang.reflect.Method.invoke(Method.java:507) 01-20 09:54:48.407: E/AndroidRuntime(8459): at com.android.internal.os。 ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 01-20 09:54:48.407: E/AndroidRuntime(8459): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 dalvik.system.NativeStart.main(Native Method)507) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 01-20 09:54:48.407: E/ AndroidRuntime(8459): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 dalvik.system.NativeStart.main(Native方法)507) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 01-20 09:54:48.407: E/ AndroidRuntime(8459): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 01-20 09:54:48.407: E/AndroidRuntime(8459): 在 dalvik.system.NativeStart.main(Native方法)

请帮助我解决这个问题。

0 投票
1 回答
1238 浏览

android - 在列表视图中加载联系人照片(使用 CursorAdapter)非常缓慢

我正在构建一个联系人应用程序。在主要活动中,我有一个列表视图,我在其中显示联系人。

我正在使用 CursorAdapter 来处理带有列表的光标

没有照片,一切都很好。

但是,当我尝试使用照片时,滚动变得迟钝。

调用打开输入流的速度非常慢,即使 inputStream 为空并且没有要加载的图像:

我能做些什么呢?

0 投票
1 回答
2575 浏览

android - 当我单击列表视图中的小部件时,如何使用 ResourceCursorAdapter 获取视图项

我有这个特殊的问题,这几天以来一直伴随着我。我使用了搜索,但找不到任何对我的问题有帮助的文章。我想这也是我搜索的一个问题。但是,回到我的问题。

我使用 ResourceCursorAdapter 来填充我的 ListView。
我的 ListView 项目看起来像..

我的适配器:

我的问题是.. 当我单击 ListView 中的按钮或复选框时,我想在特定的视图持有者中进行一些更改,例如使进度条可见或消失。我还不知道如何在我的适配器中获取 View holder 来进行更改。

我希望我能很好地解释它以解决我的问题。

0 投票
1 回答
1361 浏览

android - android更改光标适配器中的光标位置以增加或减少行

我需要实现CursorAdapter,我需要一次过滤掉某些行。

例如:首先显示 1-5,然后显示 5-10。

我已经getCount()按照它进行了管理,但只是通过更改光标位置它不起作用。

我需要知道这些行如何获得位置,或者如何推进作为参数提供的游标newView()bindView()

PS:我知道limitand pagingoffset但不想每次都获取查询

0 投票
4 回答
3783 浏览

android - 在其适配器上使用 changeCursor() 后 ListView 不刷新

我正在使用数据库,并且有一个列表片段,它使用游标适配器通过在加载器中查询数据库来获得。当用户长按列表视图项时,他会看到上下文菜单和删除此条目的选项。当他按下删除时,我正在启动一个删除此条目的线程,然后再次启动加载程序以获取新光标(因为不推荐使用“requery()”)。当加载器完成加载新光标时,我正在尝试使用changeCursor假设刷新列表视图但它没有这样做的方法,所以我尝试使用notifyDataSetChanged但它也不起作用。我已经检查过,光标从加载器返回,它确实改变了光标,但列表视图没有刷新。

我应该怎么办?重新启动片段?

这是一些代码:

加载完成后:

谢谢!

0 投票
1 回答
772 浏览

android - 带有自定义 CursorAdapter 的 ListView 无法正常工作

在我的 android 应用程序的一部分中,我有一个ListView显示表中的条目列表。当用户点击一个ListView项目时,会显示该项目的新Intent项目。

在新的意图中,用户可以对该条目进行一些操作,如阅读编辑收藏(以及当项目已经收藏时取消收藏)在详细意图中,我将其表中条目的“标记”列更改为1当它被收藏时和0不受欢迎

它工作正常。但问题出在我的主人身上ListView。我CursorAdapter为我的ListView. 我想补充ImageView一点,表明天气条目是否被收藏。在我的ListView项目的布局文件中,我为此添加了一个ImageView并将其设置visibilityGONE.

我想检测收藏的项目并将其星号设置ImageView visibilityVISIBLE。然后我在我的设备中运行该应用程序。像往常一样,没有一个条目被收藏。然后点击打开该项目的ListView详细信息页面中的第一个项目。我喜欢它并回到列表。

好的,现在第一个项目上有一个星形图标,但不仅在这个上,还有其他一些项目。这些错误星标项目的详细信息页面显示它不是收藏夹。所以问题不在于我的数据库操作。我还检查了显示标记项目的光标,.getCount()它还说只有1 个项目收藏。我找不到问题出在哪里。CursorAdapter我为自定义波纹管编写了简化的源代码:

0 投票
0 回答
323 浏览

android - 没有兼容包的自定义 CursorAdapter

我正在尝试让自定义 CursorAdapter 正常工作。我的代码目前似乎运行良好。但基于 Android 文档,我担心它可能会以微妙的方式出错。

该构造函数的注释为:

“允许控制自动重新查询的构造函数。建议您不要使用它,而是使用 CursorAdapter(Context, Cursor, int)。使用此构造函数时,将始终设置 FLAG_REGISTER_CONTENT_OBSERVER。”

并且 FLAG_REGISTER_CONTENT_OBSERVER 文档说:

“使用此标志时要小心:您需要从适配器取消设置当前光标,以避免由于其注册的观察者而导致泄漏。”

事实证明这是一个众所周知的问题,但我看到的所有建议的替代方案都指向 Compatibility Package 或 API11。我需要为 v2.1 编写代码,并且我想避免在这个项目中使用兼容性包。

我正在寻找解释使用上述构造函数的影响是什么,以及如何正确处理这些影响,或者寻找替代实现。我究竟如何“从适配器取消当前光标”?

相关问题,指向兼容包:

SimpleCursorAdapter 的替代品?

我要使用什么 CursorAdapter?

0 投票
1 回答
323 浏览

android - 为什么我的由自定义 CursorAdapter 管理的 ListView 会使用新数据自动刷新?

我在我的应用程序上遇到过这个“问题”有一段时间了,我一直困扰着我不理解它的行为,但直到现在才关心问为什么。

我有一个ListView(通过 a 实现ListActivity),每个列表项都有一个自定义布局。有了这个我有一个自定义CursorAdapter来正确填充所有列表项元素(覆盖newViewbindView,ViewHolder 模式在这样做时已经得到保证,如果需要,请参阅:https ://codereview.stackexchange.com/q/1057 )。

这是主要活动,有 2 个操作可以更新 的内容ListView、创建新项目或编辑当前项目。两者都使用相同的活动(它会根据动作类型自行调整),如下所示:

真正区分动作类型的是意图内容,requestCode在子活动中被忽略。

现在,文档对上述方法有这样的说法:

当此活动退出时,您的 onActivityResult() 方法将使用给定的 requestCode 调用。

但我没有使用onActivityResult. 实际上,当子活动存在时(在创建或编辑模式下),我什么都不做。到目前为止我注意到的行为是这样的:

  • 创建:几乎每次我返回主活动时,ListView都会使用新项目自动更新。但是,有时,尽管很少,ListView不会填充新项目。我需要销毁主要活动(例如退出应用程序)并重新创建它,然后新项目将在那里。
  • 编辑:我从未注意到与刚才描述的创建操作类似的行为。到目前为止,ListView总是会随着新内容的变化而自动更新。

我的问题是,当我从不打电话或手动通知内容的任何更改时,幕后发生了什么让我ListView自动更新它的内容?cursor.requery()为什么它不能一直工作?

我应该强迫cursor.requery()自己onActivityResult吗?

PS:我知道 CursorLoader 并且它在路线图中,但我暂时没有时间处理此类代码重写。只是想我会让你知道。现在,我只需要知道我当前的代码发生了什么。

0 投票
3 回答
2259 浏览

android - 这个 ListView 的自定义 CursorAdapter 是否为 Android 正确编码?

直到今天,我对自定义 CursorAdapter 上的代码一直不满意,直到今天我决定审查它并修复一个困扰我很长时间的小问题(有趣的是,我的应用程序的用户都没有报告过这样的问题)。

这是我的问题的一个小描述:

我的自定义 CursorAdapter 覆盖newView()bindView()而不是getView()我看到的大多数示例。我在这两种方法之间使用 ViewHolder 模式。但我的主要问题是我为每个列表项使用的自定义布局,它包含一个ToggleButton.

问题是当列表项视图滚动出视图然后滚动回视图时,按钮状态没有保持。之所以存在这个问题,是因为它cursor从来没有意识到在ToggleButton按下 时数据库数据发生了变化,并且它总是在提取相同的数据。单击时我尝试重新查询光标ToggleButton并解决了问题,但是速度很慢。

我已经解决了这个问题,我在这里发布了整个课程以供审查。我已经针对这个特定问题彻底评论了代码,以更好地解释我的编码决定。

你觉得这段代码好看吗?你会以某种方式改进/优化或改变它吗?

PS:我知道 CursorLoader 是一个明显的改进,但我暂时没有时间处理这么大的代码重写。这是我在路线图中的东西。

这是代码:

0 投票
0 回答
1353 浏览

android - Android CursorAdapter.changeCursor 导致 ListView 滚动行为异常

我想要完成的事情

我有一个 CursorAdapter 的实现,它在 ListView 中显示来自 SQLite 数据库的内容。列表视图中的控件允许用户切换数据库中的值。

问题

更新数据库中的记录后,CursorAdapter 实现使用的 Cursor 需要使用新值进行更新。根据 Android 文档,最好的方法是加载一个新光标并在 CursorAdapter http://developer.android.com/reference/android/support/v4/widget/CursorAdapter.html#changeCursor%28android上调用 changeCursor .database.Cursor%29

在这个 changeCursor 调用之后,一个讨厌的副作用导致 ListView 的滚动行为异常。“fling”会导致列表滚动,并且滚动不会停止,直到它停止。正常行为将允许用户通过触摸滚动列表来停止列表滚动,或者通过执行另一个投掷来进一步滚动该列表。ListView 在执行 changeCursor 调用之前表现正常。

我怎样才能阻止这种讨厌的副作用?!

编辑:我应该提到我正在使用 android.widget.CursorAdapter 并针对 API 级别 7 (Eclair)。