問題タブ [fragmentstatepageradapter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
12543 参照

android - ViewPager、FragmentStatePagerAdapter、無限スクロール

私が達成しようとしていること:

アダプタ内のオブジェクトのリストのフラグメントを表示する ViewPager を持つアクティビティ ( FragmentStatePagerAdapter)。

最初に、アクティビティは N 個 (5 個としましょう) のオブジェクトを SQLite DB からアダプタにロードします。これらのオブジェクトはランダムに選択されます。

ユーザーがリストの最後に到達すると、アクティビティは DB から M 個 (M を 3 とする) のオブジェクトをさらにロードし、それらをアダプターに追加して を呼び出しますnotifyDataSetChanged()。それらを追加するとき、新しいオブジェクトがリストに既に存在するかどうかを確認し、存在する場合は、既存のオブジェクトを削除し、読み込まれたオブジェクトをリストの末尾に追加します。

したがって、私は無限スクロールViewPagerのようなものを達成しようとしています(リストの物乞いに戻るのではなく、新しいオブジェクトを常にフェッチしたいので、「循環」ViewPagerではありません)。

私はいくつかの実用的なコードを持っており、以下のパターンのサンプルを含めました。ただし、この例外が引き続き発生し、理由がわかりません。

コードサンプル:

アクティビティ:

PagerAdapter:

私のフラグメント:

なぜこれを取得しているのかについての考えはありExceptionますか? はもう存在しないアイテムを破壊しようとしているようですFragmentStatePagerAdapterが、その理由はわかりません。

編集1:

にコメントすると、@Override getItemPosition(Object object)もう例外は発生しません。getItemPositionただし、ユーザーが現在表示されているオブジェクトを削除して、アダプターの配列からオブジェクトを削除し、アイテムが存在しなくなった場合に強制的getItemPositionに返すというユースケースがあるため、オーバーライドする必要があります。POSITION_NONE

編集2:

これで、この例外は、アダプターからアイテムを削除したときにのみ発生することがわかりましたobjectListMyObjectからインスタンスが削除される状況が 2 つありobjectListます。

  • getMoreObjects()addが既に にあったオブジェクトを DB からフェッチするとobjectList、それを削除して、リストの先頭に再度追加します。これは、objectList に同じ ID を持つオブジェクトが存在しないようにするためです。オブジェクトの ID は、getItemPosition()存在するかどうかとその位置を知るために使用されます。

  • を返す前にgetMoreObjects()、リストから最初の N 個のオブジェクトを削除します。FragmentStatePagerAdapter は、一部のオブジェクトのメモリ フラグメントのみを保持することで既にメモリを節約していることは知っていますが、それでも大きくobjectListなりすぎないようにしたいと考えています。今のところ、この行はそれほど重要ではないのでコメントしています。

0 投票する
0 に答える
875 参照

android - 向きが変更された後、FragmentStatePagerAdapter getItem メソッドが呼び出されない

アクティビティと 3 つのフラグメントがあります。サポートタブには PagerSlidingTabStrip を使用します。アダプタ:

アクティビティ

アプリが最初に読み込まれるときgetItemは、3 回実行されます。何が正しい。最初のフラグメントが表示されます。次に、変更後getItem、最初のフラグメントのローレーションは実行されません。しかし、秒または 3 番目に切り替えると、getItem実行されます。

画面の向きが変更されたときに最初のフラグメントに対して getItem が呼び出されない理由を教えてください。