1

ResourceCursorAdapter によって設定された ListView があります。ローダーメカニズムを使用して、リスト アイテムの ContentProvider をクエリします。リストアイテムでスワイプジェスチャを検出して、それらに対していくつかのアクションを実行します。新しいアイテムはバックグラウンド サービスによって追加されるため、リストは動的に変化します。

スワイプを開始してデータベースの変更が発生した場合 (バックグラウンド サービスが新しい行を追加した結果) を除いて、すべて正常に動作します。このような場合、ジェスチャが正しく検出されません。リスト アイテム ビューに ACTION_CANCEL がディスパッチされ、表示されているすべてのアイテムに対して bindView が実行されることに気付きました。bindView メソッド内では、いくつかのテキストを設定するだけで、リスナーは変更しません。

バックグラウンド サービスによって新しいアイテムが追加されている場合でも、ジェスチャを機能させるにはどうすればよいですか? おそらく、モーションがキャンセルされないようにする方法があるか、データベースの更新を一時停止して、ジェスチャーが中断されないようにすることができます。

4

3 に答える 3

0

データと UI の更新を分離する必要があります。これは少し醜いでしょう。

1)カーソルアダプタを使用しないでください。カーソルからの結果を何らかのデータ構造にロードし、アダプターにそのデータのコピーを使用させます。次に、新しいデータを取得したら、そのデータ構造の新しいコピーを作成し、それをアダプターが参照する変数に保存して、notifyDataSetChanged を呼び出します。そうすれば、カーソルの変更と画面の更新はリンクされません。

2)サービスがカーソルを更新するとき、リストビューを自動的に更新しないでください。次に、ListView をサブクラス化します。サービスから更新を取得したら、新しいデータを保存しますが、リストビューは更新しません。代わりに、フラグを設定します。新しい ListView サブクラスで onTouchEvent をオーバーライドして、ACTION_UP イベントが発生したときにそのフラグもチェックするようにします。フラグが設定されている場合は、false にしてから、アダプターで notifyDataSetChanged を実行します。このようにして、ユーザーがスクロールを完了するまでリストは更新されません。

于 2013-07-03T11:16:44.800 に答える
0

ResourceCursorAdapter で、ビューのタッチ リスナーを に設定しますnewView()。で使用するタッチ リスナーを渡すには、おそらくアダプターのコンストラクターを変更する必要がありますnewView()

于 2013-07-03T11:10:34.097 に答える