2011-03-24 8 views
0

新しい空白の行を追加し、新しい行のコントロールを編集可能にするために、AndroidでListViewを作成したいと考えています。次に、ユーザーが追加を再度クリックするか、別の行を選択するか、まだ決定していない他のトリガーをクリックして)、ユーザーが編集可能な行に入力した値でアダプタを更新します。編集可能なListView - UI値を使用したアダプタの更新

現在、各行には編集可能なコントロールがあり、メニュー項目から空白の行を追加する機能があります。私はユーザーが入力したデータをアダプタと同期させる方法を理解できません。

私はもともと、アダプターは双方向データバインドだと考えましたが、そうではないようです。私の研究と実験から、アダプタの値を変更してnotifyDataSetChanged()を呼び出すと、UIが更新されます。逆の操作はありますか?

+0

ListViewでどのように値を編集していますか?データセットを変更してnotifyDataSetChanged()を呼び出すと、ListViewアイテムにデータを入力するだけでよいのです。 – LeffelMania

答えて

2

で位置posにオブジェクトを更新しますUPDATのmthodを持っていることを確認し、私は結合双方向のデータを達成することができました私の行のViewの各コントロールにKeyListenerとOnFocusChangeListenerを追加します。これらの両方のイベントは、ビューのすべてのコントロールをループし、現在の値でアダプタのデータを更新するために、私の行のViewで作成したメソッドに呼び出されます。 notifyDataSetChanged()を呼び出さないようにする必要がありました。このメソッドは、データソースオブジェクトをプログラムによって変更し、UIに変更を反映させる場合にのみ必要です。

これまでで最も効率的な方法ではありませんが、うまく機能します。

もう1つ注意すべきことは、行の追加と削除私は、アダプタビューの更新のコントロールレベルとビューレベルスケルチングの両方を設定する必要がありました。削除の場合は、行のビューに長いクリックイベントを追加して削除オプション付きのメニューを作成しました。その後、データソースオブジェクトをプログラムで編集して、指定された行データを削除し、notifyDataSetChanged()を呼び出します(そうでなければ、OSは例外をスローします)。ここでスクエッチすると、私のイベントに当たって無限ループに陥ることがなくなり、データが正しく同期されます。その後、削除された行ビューで、自分のコントロールをすべて設定してイベントのアップデートアダプターをスケルチします。削除された行ビューにはまだフォーカスがあり、データソースオブジェクトをUIにない値で更新しないようにしたいからです。私のアダプタのgetView()のListViewリサイクルプロセスから行のViewを取得すると、このフラグは反転されます。

新しい行を追加するには、行の表示レベルだけでスケルチする必要があります。これは、プログラムでデータソースを新しい空のデータ行で変更し、notifyDataSetChangedを呼び出すためです。理由は削除とまったく同じです。

0

あなたの問題は帽子です。たとえば、リストの300アイテム(EditItemsには返されます)が実際にリサイクルされる12-20のEditItemだけです。 私は自分のビューでFocsedChangedListenerが使用されていることを知る唯一の方法だと思います。

  1. アダプタのgetViewメソッドを使用している:フォーカス一度 は使用オフになっているvは、あなたのビューである場合は、次に行うv.setTag(位置)OnFocusChangedListenerで
  2. 焦点がオフになると使用:int型のPOS =(整数) v.getTag(); mAdapter.updatePosition(テキスト、POS)
  3. はアダプタが文字列「テキスト」
+0

onFocusChangedListenerの問題点1)トラックボールを使用して行1の編集可能なコントロールから行2の次の編集可能なコントロールに移動すると発生します。2)リスト外のボタンをクリックしてもイベント。 3)リストをスクロールしても、このイベントは発生しません。 –

0

Cニックの解決策を少し絞り込むために、EditText.addTextChangedListenerを使用できます。

関連する問題