我遇到以下问题:
我有一个ListActivity,它的ListView由图标,文本和复选框(使用LayoutInflater)组成。
ListView的适配器扩展了ResourceCursorAdapter(即从数据库检索ListView的数据源,也检查每行的Checked状态)
一切都很好用,除非我取消选中/选中任意一行中的复选框,如果我向下滚动直到修改后的复选框不再可见,然后向上滚动,复选框将恢复到其原始状态。
数据库被修改,这不是问题(即如果我修改行并退出活动,再次输入,则修改的行显示为Ok)。
我的猜测是,这与列表的呈现方式有关,因为出于某种原因,ListView在呈现滚动时首次填充时会“呈现”所有行的原始状态。
我一直在寻找这个bug,但我找不到任何有这个问题的人。我很感激你的任何建议。
答案 0 :(得分:2)
此链接可让您深入了解问题
EditText items in a scrolling list lose their changes when scrolled off the screen
列表行被回收。你的光标 可能有1000条记录,但有 不会是1,000 EditText 滚动浏览时创建的小部件 列表。相反,将有10或 所以,取决于行数 同时可见。行得到 回收和绑定操作 将替换旧的EditText值 使用Cursor的新值 什么行只是滚动到 屏幕,取代那里的东西 之前(之前的值) 数据库或用户编辑的值。)
答案 1 :(得分:1)
当项目进入视图时,将调用ListAdapter.getView()方法。
如果您将项目从屏幕上滚动然后再打开,则每个会话可能会多次发生这种情况。
我建议你在getView()上放一个断点并用调试器运行app。重复测试,并在第二次调用getView()时,检查设置复选框的逻辑。
另一个考虑因素是getView的第二个参数是'convertView'视图。这是您自己的其他列表条目中不再可见的视图之一。操作系统正在将此视图返回给您,以便您可以选择“回收”视图以创建新条目,而不是膨胀会对性能产生影响的新视图。
如果你忽略了这个参数,它就不会有问题了(虽然为了制作一个平滑的滚动列表,你可以考虑将来使用它 - 只需记住通过设置标签来检查View是你想要的类型)。
如果您选择使用此参数来尝试视图回收,请检查您的逻辑,并确保将所有控件设置为所需状态,因为布局默认状态可能不适用。
答案 2 :(得分:1)
通过在修改数据库后关闭相应的游标并使用changeCursor()再次打开它来解决问题。