问题标签 [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.
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.measureChildHorizontal(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方法)
请帮助我解决这个问题。
android - 在列表视图中加载联系人照片(使用 CursorAdapter)非常缓慢
我正在构建一个联系人应用程序。在主要活动中,我有一个列表视图,我在其中显示联系人。
我正在使用 CursorAdapter 来处理带有列表的光标
没有照片,一切都很好。
但是,当我尝试使用照片时,滚动变得迟钝。
调用打开输入流的速度非常慢,即使 inputStream 为空并且没有要加载的图像:
我能做些什么呢?
android - 当我单击列表视图中的小部件时,如何使用 ResourceCursorAdapter 获取视图项
我有这个特殊的问题,这几天以来一直伴随着我。我使用了搜索,但找不到任何对我的问题有帮助的文章。我想这也是我搜索的一个问题。但是,回到我的问题。
我使用 ResourceCursorAdapter 来填充我的 ListView。
我的 ListView 项目看起来像..
我的适配器:
我的问题是.. 当我单击 ListView 中的按钮或复选框时,我想在特定的视图持有者中进行一些更改,例如使进度条可见或消失。我还不知道如何在我的适配器中获取 View holder 来进行更改。
我希望我能很好地解释它以解决我的问题。
android - android更改光标适配器中的光标位置以增加或减少行
我需要实现CursorAdapter
,我需要一次过滤掉某些行。
例如:首先显示 1-5,然后显示 5-10。
我已经getCount()
按照它进行了管理,但只是通过更改光标位置它不起作用。
我需要知道这些行如何获得位置,或者如何推进作为参数提供的游标newView()
和bindView()
。
PS:我知道limit
and paging
,offset
但不想每次都获取查询
android - 在其适配器上使用 changeCursor() 后 ListView 不刷新
我正在使用数据库,并且有一个列表片段,它使用游标适配器通过在加载器中查询数据库来获得。当用户长按列表视图项时,他会看到上下文菜单和删除此条目的选项。当他按下删除时,我正在启动一个删除此条目的线程,然后再次启动加载程序以获取新光标(因为不推荐使用“requery()”)。当加载器完成加载新光标时,我正在尝试使用changeCursor
假设刷新列表视图但它没有这样做的方法,所以我尝试使用notifyDataSetChanged
但它也不起作用。我已经检查过,光标从加载器返回,它确实改变了光标,但列表视图没有刷新。
我应该怎么办?重新启动片段?
这是一些代码:
加载完成后:
谢谢!
android - 带有自定义 CursorAdapter 的 ListView 无法正常工作
在我的 android 应用程序的一部分中,我有一个ListView
显示表中的条目列表。当用户点击一个ListView
项目时,会显示该项目的新Intent
项目。
在新的意图中,用户可以对该条目进行一些操作,如阅读、编辑、收藏(以及当项目已经收藏时取消收藏)。在详细意图中,我将其表中条目的“标记”列更改为1当它被收藏时和0时不受欢迎。
它工作正常。但问题出在我的主人身上ListView
。我CursorAdapter
为我的ListView
. 我想补充ImageView
一点,表明天气条目是否被收藏。在我的ListView
项目的布局文件中,我为此添加了一个ImageView
并将其设置visibility
为GONE
.
我想检测收藏的项目并将其星号设置ImageView
visibility
为VISIBLE
。然后我在我的设备中运行该应用程序。像往常一样,没有一个条目被收藏。然后点击打开该项目的ListView
详细信息页面中的第一个项目。我喜欢它并回到列表。
好的,现在第一个项目上有一个星形图标,但不仅在这个上,还有其他一些项目。这些错误星标项目的详细信息页面显示它不是收藏夹。所以问题不在于我的数据库操作。我还检查了显示标记项目的光标,.getCount()
它还说只有1 个项目收藏。我找不到问题出在哪里。CursorAdapter
我为自定义波纹管编写了简化的源代码:
android - 没有兼容包的自定义 CursorAdapter
我正在尝试让自定义 CursorAdapter 正常工作。我的代码目前似乎运行良好。但基于 Android 文档,我担心它可能会以微妙的方式出错。
该构造函数的注释为:
“允许控制自动重新查询的构造函数。建议您不要使用它,而是使用 CursorAdapter(Context, Cursor, int)。使用此构造函数时,将始终设置 FLAG_REGISTER_CONTENT_OBSERVER。”
并且 FLAG_REGISTER_CONTENT_OBSERVER 文档说:
“使用此标志时要小心:您需要从适配器取消设置当前光标,以避免由于其注册的观察者而导致泄漏。”
事实证明这是一个众所周知的问题,但我看到的所有建议的替代方案都指向 Compatibility Package 或 API11。我需要为 v2.1 编写代码,并且我想避免在这个项目中使用兼容性包。
我正在寻找解释使用上述构造函数的影响是什么,以及如何正确处理这些影响,或者寻找替代实现。我究竟如何“从适配器取消当前光标”?
相关问题,指向兼容包:
android - 为什么我的由自定义 CursorAdapter 管理的 ListView 会使用新数据自动刷新?
我在我的应用程序上遇到过这个“问题”有一段时间了,我一直困扰着我不理解它的行为,但直到现在才关心问为什么。
我有一个ListView
(通过 a 实现ListActivity
),每个列表项都有一个自定义布局。有了这个我有一个自定义CursorAdapter
来正确填充所有列表项元素(覆盖newView
和bindView
,ViewHolder 模式在这样做时已经得到保证,如果需要,请参阅:https ://codereview.stackexchange.com/q/1057 )。
这是主要活动,有 2 个操作可以更新 的内容ListView
、创建新项目或编辑当前项目。两者都使用相同的活动(它会根据动作类型自行调整),如下所示:
真正区分动作类型的是意图内容,requestCode
在子活动中被忽略。
现在,文档对上述方法有这样的说法:
当此活动退出时,您的 onActivityResult() 方法将使用给定的 requestCode 调用。
但我没有使用onActivityResult
. 实际上,当子活动存在时(在创建或编辑模式下),我什么都不做。到目前为止我注意到的行为是这样的:
- 创建:几乎每次我返回主活动时,
ListView
都会使用新项目自动更新。但是,有时,尽管很少,ListView
不会填充新项目。我需要销毁主要活动(例如退出应用程序)并重新创建它,然后新项目将在那里。 - 编辑:我从未注意到与刚才描述的创建操作类似的行为。到目前为止,
ListView
总是会随着新内容的变化而自动更新。
我的问题是,当我从不打电话或手动通知内容的任何更改时,幕后发生了什么让我ListView
自动更新它的内容?cursor.requery()
为什么它不能一直工作?
我应该强迫cursor.requery()
自己onActivityResult
吗?
PS:我知道 CursorLoader 并且它在路线图中,但我暂时没有时间处理此类代码重写。只是想我会让你知道。现在,我只需要知道我当前的代码发生了什么。
android - 这个 ListView 的自定义 CursorAdapter 是否为 Android 正确编码?
直到今天,我对自定义 CursorAdapter 上的代码一直不满意,直到今天我决定审查它并修复一个困扰我很长时间的小问题(有趣的是,我的应用程序的用户都没有报告过这样的问题)。
这是我的问题的一个小描述:
我的自定义 CursorAdapter 覆盖newView()
,bindView()
而不是getView()
我看到的大多数示例。我在这两种方法之间使用 ViewHolder 模式。但我的主要问题是我为每个列表项使用的自定义布局,它包含一个ToggleButton
.
问题是当列表项视图滚动出视图然后滚动回视图时,按钮状态没有保持。之所以存在这个问题,是因为它cursor
从来没有意识到在ToggleButton
按下 时数据库数据发生了变化,并且它总是在提取相同的数据。单击时我尝试重新查询光标ToggleButton
并解决了问题,但是速度很慢。
我已经解决了这个问题,我在这里发布了整个课程以供审查。我已经针对这个特定问题彻底评论了代码,以更好地解释我的编码决定。
你觉得这段代码好看吗?你会以某种方式改进/优化或改变它吗?
PS:我知道 CursorLoader 是一个明显的改进,但我暂时没有时间处理这么大的代码重写。这是我在路线图中的东西。
这是代码:
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)。