2

我有一个由 SimpleCursorAdapter 创建的 EditText 项目的长滚动列表,并预先填充了来自 SQLite 数据库的值。

我通过以下方式制作:

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);

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

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

但是...如果我随后将列表滚动到足以将已编辑的项目从屏幕上移开,当我再次滚动查看它时,它的值已恢复到我进行更改之前的值,即我的编辑已丢失.

为了解决这个问题,我做了一个 getText 来查看在我完成编辑之后(以及在滚动之前)的 EditText 中的内容,并且 getText 返回原始文本,即使 EditText 正在显示我的文本。似乎 EditText 只是表面上接受了我的编辑,并且它们没有绑定到 EditText,这意味着它们在滚动离开屏幕时会被丢弃。

谁能告诉我这里发生了什么以及我需要做什么来强制 EditText 保留其编辑?

4

2 回答 2

3

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

当然。

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

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

我怀疑可以通过创建一个自定义类并自己处理所有行回收来创建一个ListView带有行的行。但是,这将是相当多的工作,并且内置类只会为您提供对这种模式的一点支持。EditTextsAdapter

于 2010-06-14T11:13:44.420 回答
0

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

于 2012-11-09T16:51:05.060 回答