Android 滚动列表中的编辑文本项在滚动到屏幕外时将丢失其更改
我有一个由SimpleCorsorAdapter创建的EditText项的长滚动列表,其中预填充了来自SQLite数据库的值 我是这样做的:Android 滚动列表中的编辑文本项在滚动到屏幕外时将丢失其更改,android,scroll,android-edittext,Android,Scroll,Android Edittext,我有一个由SimpleCorsorAdapter创建的EditText项的长滚动列表,其中预填充了来自SQLite数据库的值 我是这样做的: cursor = db.rawQuery("SELECT _id, criterion, localweight, globalweight FROM " + dbTableName + " ORDER BY criterion", null); startManagingCursor(cursor); mAdapter = new SimpleCur
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-滚动显示每个项目都具有数据库中的正确值
我可以对任何编辑文本进行编辑更改,新文本将被接受并显示在框中
但是。。。如果我将列表滚动到足以将编辑的项目从屏幕上取下,当我向后滚动以再次查看时,其值已恢复到更改前的值,即,我的编辑已丢失
为了解决这个问题,我做了一个getText,在编辑之后(在滚动之前)查看EditText中的内容,getText返回原始文本,即使EditText正在显示我的新文本。EditText似乎只是表面上接受了我的编辑,并且它们没有绑定到EditText,这意味着它们在屏幕上滚动时会被删除
谁能告诉我这里发生了什么,我需要做什么来强制EditText保留编辑
但是…如果我将列表滚动到很远的地方
足以将已编辑的项目从列表中删除
屏幕,当我向后滚动查看
它的价值又回到了原来的水平
在我做出改变之前是什么样子的,
我的编辑丢失了
当然
列表行被回收。您的光标
可能有1000条记录,但如果滚动列表,则不会创建1000条EditText
小部件。相反,将有10个左右,这取决于同时可见的行数。行被回收,绑定操作将用光标中的新值替换旧的EditText
值,用于屏幕上刚刚滚动的任何行,替换之前存在的任何行(数据库中以前的值或用户编辑的值)
而且,由于常规的光标
是不可变的,因此您无法以透明的方式将任何编辑内容保留到列表中
我怀疑有可能创建一个包含editText
行的ListView
,可能是通过创建一个自定义Adapter
类并自行处理所有行来实现的。然而,这将是一个相当大的工作量,内置类只会为您提供一点对该模式的支持。我到处搜索,以找到这个确切问题的答案,并最终能够在适配器内的EditText上使用onFocusChangeListener解决该问题。我在这里发布了我的解决方案:
谢谢你这么好的回答-解释得很好(对我来说很不幸!)我必须试着想出一些行回收或重新思考我的基本设计。