2

カーソルを使用して水平スワイプを実行しようとしていますが、何かを理解しているわけではありません。うまくいけば、ここの誰かが理解を助けてくれます。

アイテムのリストを表示するアクティビティがあります。ListViewカスタム によってサポートされる を使用し、CursorAdapterそのアダプタは によって管理されますLoaderCallback。これはすべて標準的なものです。

ユーザーがリスト内の項目をクリックすると、その項目に関する詳細情報を表示したいと考えています。現在、選択したアイテムの ID を渡して、新しいアクティビティを開始しています。このアクティビティは、アイテムに関する情報をデータベースから読み込みます。繰り返しますが、標準的なものです。

現在、アイテムのリストを行き来し、アイテムをクリックしてそのアイテムの詳細を表示することは、最適なユーザー エクスペリエンスではありません。ユーザーがアイテムをクリックしてその情報を表示できるようにしてから、スワイプできるようにすることが望ましいでしょう。リスト内の次または前の項目に関する詳細を表示します。

ListViewしたがって、アイテムが でクリックされたときに、 を含むアクティビティを開始する必要があると仮定しますViewPager。これViewPagerは、適切な位置でビューをフェッチする責任がある PagerAdapter によって支えられています。

CursorAdapterしたがって、リスト アクティビティで使用される を詳細アクティビティに渡しPagerAdapter、カーソルをトラバースして現在のアイテムの詳細をビュー ページャーに表示する を実装したいと思います。これは非常に単純に思えます:カーソルから Fragment をgetItem(pos)呼び出してから作成するなどです。cursor.moveToPosition(pos)

しかし、(1)CursorAdapterバンドル内で渡すためにシリアル化できるとは思わないため、アクティビティに a を渡す方法がわかりません。また、(2) CursorAdapter を別のアクティビティに渡すのをためらっています。LoaderCallbacksライフサイクルを管理するために添付されていません。

考えられる解決策の 1 つは、新しいアクティビティを開始し、そのアクティビティで新しい検索を実行して、リスト アクティビティで見つかったカーソルと同等のカーソルを取得することです。たとえば、リスト アクティビティが「title=foo」に一致するアイテムを表示している可能性があるため、アイテム 10 がクリックされると、アイテム 10 に関する情報を表示する新しい詳細アクティビティを作成しますが、「title=foo」検索を実行して横スワイプで使えるカーソル。しかし、これは同じ検索を 2 回実行していることを意味します。1 回はリスト ビューで、もう 1 回はページング ビューです。検索に時間がかかる場合は、これが問題になることがあります。

カーソルをグローバルな静的領域 ( などApplication) に格納することもできますが、これにも危険が伴うようです。

もありますParcelableが、これは、一方の側でカーソルをシリアル化し、もう一方の側で逆シリアル化していることを意味すると思います。リストが大きい場合は、検索を再度実行して新しいカーソルを取得する方が効率的です。

これは一般的なシナリオだと確信しているので、複数のアクティビティ間でカーソルを管理するためのベスト プラクティスは何か、または他のアプローチの方が優れているかどうかを知りたいです。

4

1 に答える 1

2

いいえ、カーソルやカーソル アダプタなどを他のアクティビティに渡さないでください。contextプロセスのあるレベルで、オブジェクトの作成のためにアクティビティを渡す必要があったに違いありません。そのオブジェクトが何らかの形で別のコンテキストを使用して別のアクティビティになった場合、事態はおそらくおかしなことになります。

さらに、そもそもアダプター自体が必要な理由がわかりません。カーソルだけを使用して (再インスタンス化)、新しいアクティビティに同じカーソルを使用し、クリックした位置を渡して作成し、表示PagerAdapterする詳細位置を事前に選択する方法はありませんか? あなたが言ったことと同じですが、新しい検索は必要ありませんposition。インテントに渡します。

于 2012-12-08T03:22:00.423 に答える