このシナリオでは、6 つのフラグメントを持つ ViewPager がアクティビティ内に実装されます。フラグメント間のスワイプは無効になっているため、ボタンを使用して現在のフラグメントを変更します。 GET リクエストがサーバーに送信され、スワイプが完了すると応答データが各フラグメントに表示されます。
最初のアプローチ (setUserVisibleHint を使用)
最初に、 setUserVisibleHint メソッドを使用して、フラグメントが表示されるたびに GET リクエストをトリガーしました。ただし、このアプローチでは、リクエストが即時に実行されるため、スワイプ アニメーションに遅れが生じました。
2 番目のアプローチ (OnPageChangeListener を使用)
アニメーションの遅れを克服するには、OnPageChangeListener が ViewPager に追加されました。このリスナーはページのスクロール状態を追跡し、目的のフラグメントが完全に表示されると (つまり、スクロール状態が IDLE に等しい) ときに GET リクエストを送信します。
問題と解決策
2 番目の方法はうまくいきましたが、sendGetRequest() の実行時に NullPointerException が発生しました。これは、フラグメント参照が適切に取得されていなかったためです。これを解決するには、FragmentPagerAdapter の instantiateItem メソッドにフラグメントへの参照を保存する必要がありました。次に、OnPageChangeListener 内で、新しいフラグメントを作成する代わりに、ViewPagerPagerAdapter から参照されるフラグメントを使用できます。
ViewPager2 の更新コード (Kotlin)
viewPager.registerOnPageChangeCallback(
object: ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
val frag: Fragment = mAdapter.fragments[position]
if (frag != null && frag is FragmentTwo) {
(frag as FragmentTwo).sendGetRequest()
}
}
}
)
ここで、mAdapter は ViewPager2 内で使用される FragmentPagerAdapter を指します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3