滚动列表中的EditText项目在屏幕上滚动时会丢失其更改

问题描述:

我有一个由SimpleCursorAdapter创建的EditText项目的长滚动列表,并预填充了SQLite数据库中的值。滚动列表中的EditText项目在屏幕上滚动时会丢失其更改

我通过使这个:

cursor = db.rawQuery("SELECT _id, criterion, localweight, globalweight FROM " + dbTableName + " ORDER BY criterion", null); 

startManagingCursor(cursor); 

mAdapter = new SimpleCursorAdapter(this, R.layout.weight_edit_items, cursor, new String[]{"criterion","localweight","globalweight"}, new int[]{R.id.criterion_edit, R.id.localweight_edit, R.id.globalweight_edit});  

this.setListAdapter(mAdapter); 

滚动列表是几个模拟器的屏幕长。项目显示OK - 滚动显示它们每个都具有来自数据库的正确值。

我可以对任何EditTexts进行编辑更改,新文本将被接受并显示在框中。

但是......如果我滚动列表足够远以将编辑的项目从屏幕上移开,当我再次滚动查看它时,它的值已经返回到我进行更改之前的状态,即。我的编辑已经丢失。

在试图理清了这一点,我已经做了的getText看我做了后,我的编辑(和滚动前)和GetText返回的文本中的EditText什么,即使的EditText正在显示我的新的文字。看起来EditText只是表面上接受了我的编辑,并且他们还没有被绑定到EditText,这意味着当他们滚动屏幕时他们会被放弃。

任何人都可以告诉我这里发生了什么,我需要做什么来强制EditText保留其编辑?

感谢

伊恩

但是......如果我再滚动列表远远不够 取编辑的项目关闭 屏幕,当我卷回再看看 它的值已返回到 之前我做了更改, 即。我的编辑已经丢失。

当然。

列表行被回收。您的Cursor可能有1,000条记录,但如果您滚动浏览列表,则不会创建1,000 EditText小部件。相反,将会有10个左右,这取决于同时可见多少行。行被回收,绑定操作将替换旧的EditText值,其值为Cursor中的新值,用于刚刚滚动到屏幕上的任何行,替换以前的任何值(来自数据库的以前值或用户编辑的值)。

而且,由于常规Cursor是不可变的,因此您无法以透明地将其放回到列表中的方式持久保存任何编辑。

我怀疑有可能创建一个行数为EditTextsListView,可能是通过创建一个自定义的Adapter类并处理所有的行自行回收。然而,这将是一个相当大的工作量,内置的类只会给你一点这种模式的支持。

+0

感谢这么好的答案 - 解释得非常好(不幸的是,对我来说)。我将不得不尝试想出一些行回收或重新考虑我的基本设计。 – ianww 2010-06-14 12:26:18

我搜索了所有这个确切的问题的答案,并最终能够解决问题,onFocusChangeListener在我的EditText适配器内。我在这里发布我的解决方案: https://stackoverflow.com/a/13312282/1812518