滚动后,将恢复ListView中的Checkset'Checked'

时间:2010-04-04 11:09:29

标签: android listview checkbox

我遇到以下问题:

我有一个ListActivity,它的ListView由图标,文本和复选框(使用LayoutInflater)组成。

ListView的适配器扩展了ResourceCursorAdapter(即从数据库检索ListView的数据源,也检查每行的Checked状态)

一切都很好用,除非我取消选中/选中任意一行中的复选框,如果我向下滚动直到修改后的复选框不再可见,然后向上滚动,复选框将恢复到其原始状态。

数据库被修改,这不是问题(即如果我修改行并退出活动,再次输入,则修改的行显示为Ok)。

我的猜测是,这与列表的呈现方式有关,因为出于某种原因,ListView在呈现滚动时首次填充时会“呈现”所有行的原始状态。

我一直在寻找这个bug,但我找不到任何有这个问题的人。我很感激你的任何建议。

3 个答案:

答案 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()再次打开它来解决问题。