2

SimpleCursorAdapterによって作成され、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]と表示されます。アイテムをスクロールすると、それぞれがデータベースからの正しい値を持っていることがわかります。

任意のEditTextに編集変更を加えることができ、新しいテキストが受け入れられてボックスに表示されます。

しかし...次に、編集したアイテムを画面から削除するのに十分な距離までリストをスクロールすると、スクロールして戻ってもう一度見ると、変更を加える前の値に戻ります。つまり、編集内容が失われます。 。

これを整理するために、getTextを実行して、編集を行った後(およびスクロールの前)にEditTextの内容を確認しました。編集テキストが新しいテキストを表示している場合でも、getTextは元のテキストを返します。EditTextは私の編集を表面的にしか受け入れておらず、EditTextにバインドされていないようです。つまり、画面からスクロールするとドロップされます。

誰かがここで何が起こっているのか、そしてEditTextに編集を保持させるために何をする必要があるのか​​教えてもらえますか?

4

2 に答える 2

3

しかし...次に、編集したアイテムを画面から外すのに十分な距離までリストをスクロールすると、スクロールして戻ってもう一度見ると、その値は変更を加える前の値に戻ります。私の編集は失われました。

もちろん。

リスト行はリサイクルされます。Cursor1,000のレコードがあるかもしれませんが、リストをスクロールしても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 に答える