我有一个由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);
滚动列表是多个模拟器屏幕。项目显示OK - 滚动它们显示每个项目都具有数据库中的正确值。
我可以对任何EditTexts进行编辑更改,并接受新文本并显示在框中。
但是......如果我然后滚动列表足够远以将编辑的项目从屏幕上移开,当我向后滚动以再次查看它时它的值已经恢复到我进行更改之前的状态,即。我的编辑遗失了。
在尝试对此进行排序时,我已经完成了一个getText来查看EditText中的内容(在我完成编辑之后(和滚动之前)并且getText返回原始文本,即使EditText显示我的新文本。看起来EditText只是表面上接受了我的编辑,它们还没有绑定到EditText,这意味着它们在屏幕滚动时会被删除。
任何人都可以告诉我这里发生了什么以及我需要做些什么才能强制EditText保留其编辑内容?
由于
伊恩
答案 0 :(得分:3)
但是......如果我然后滚动列表远 足以将编辑过的物品带走 屏幕,当我滚动回去看 它的价值再次回归 在我做出改变之前是什么 即。我的编辑遗失了。
当然。
列表行被回收。您的Cursor
可能有1,000条记录,但如果滚动列表,则不会创建1,000 EditText
个小部件。相反,将有10个左右,具体取决于同时可见的行数。行被回收,并且绑定操作将使用EditText
中的新值替换旧的Cursor
值,用于刚刚滚动到屏幕上的任何行,替换之前的任何内容(数据库中的先前值或用户编辑的值)。
而且,由于常规Cursor
是不可变的,因此您无法以透明方式将任何编辑保留在列表中。
我怀疑可以通过创建自定义ListView
类并自行处理所有行回收来创建EditTexts
行Adapter
。但是,这将是相当多的工作,内置类只会给你一些支持这种模式。
答案 1 :(得分:0)
我在SO上搜索了这个确切问题的答案,终于能够在适配器内的EditText上使用onFocusChangeListener来解决问题。我在这里发布了解决方案: https://stackoverflow.com/a/13312282/1812518