Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 滚动列表中的编辑文本项在滚动到屏幕外时将丢失其更改_Android_Scroll_Android Edittext - Fatal编程技术网

Android 滚动列表中的编辑文本项在滚动到屏幕外时将丢失其更改

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

我有一个由SimpleCorsorAdapter创建的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-滚动显示每个项目都具有数据库中的正确值

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

但是。。。如果我将列表滚动到足以将编辑的项目从屏幕上取下,当我向后滚动以再次查看时,其值已恢复到更改前的值,即,我的编辑已丢失

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

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

但是…如果我将列表滚动到很远的地方 足以将已编辑的项目从列表中删除 屏幕,当我向后滚动查看 它的价值又回到了原来的水平 在我做出改变之前是什么样子的, 我的编辑丢失了

当然

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

而且,由于常规的
光标
是不可变的,因此您无法以透明的方式将任何编辑内容保留到列表中


我怀疑有可能创建一个包含
editText
行的
ListView
,可能是通过创建一个自定义
Adapter
类并自行处理所有行来实现的。然而,这将是一个相当大的工作量,内置类只会为您提供一点对该模式的支持。

我到处搜索,以找到这个确切问题的答案,并最终能够在适配器内的EditText上使用onFocusChangeListener解决该问题。我在这里发布了我的解决方案:

谢谢你这么好的回答-解释得很好(对我来说很不幸!)我必须试着想出一些行回收或重新思考我的基本设计。