[解決済み] ViewPagerがコンテンツを再描画せず、空白のままになる。
質問
ViewPagerで非常に奇妙な問題に悩まされています。各 ViewPager ページにリストを埋め込み、リスト データを更新するときにリスト アダプタと View Pager アダプタの両方で notifyDataSetChanged をトリガします。
観察されるのは、時々、ページがそのビュー ツリーを更新しない、つまり空白のままであったり、時にはページングすると消えてしまったりすることです。数回ページングを行ったり来たりすると、コンテンツが突然再表示されます。これは、Android がビューの更新を逃しているように思えます。また、階層ビューアを使用してデバッグする場合、ビューを選択すると必ず再表示されることに気づきました。これは、階層ビューアが選択したビュー自体を強制的に再描画するためと思われます。
リストビュー、またはビューページャー全体を無効にしても効果がありませんでした。
これは compatibility-v4_r7 ライブラリを使用したものです。ビュー ページャーに関連する多くの問題を修正すると主張しているので、最新のリビジョンも使用しようとしましたが、問題はさらに悪化しました (たとえば、ジェスチャが壊れて、時々、すべてのページをページングできなくなりました。)。
他にこのような問題に遭遇している人はいますか、または、この原因について何か心当たりがありますか。
どのように解決するのですか。
最終的に解決策を見つけることができました。どうやら私たちの実装には 2 つの問題があるようです。
-
のビューを削除しないことです。
destroyItem()
. -
でビューを削除していなかったので、レイアウトを一度だけ膨らませるためにビューをキャッシュしていました。
destroyItem()
でビューを削除しておらず、またinstantiateItem()
で追加するのではなく、単に現在の位置に対応するキャッシュされたビューを返していただけなのです。
のソースコードをあまり深く見ていないのですが、このように
ViewPager
- のソースコードを深く見ていないため、そうしなければならないことが明示されているわけではありませんが、docs には :
destroyItem()
与えられた位置のページを削除します。アダプタは、コンテナからビューを削除する責任を負いますが、 finishUpdate(ViewGroup)から戻るまでにこれが行われることを保証するだけでなければなりません。
とします。
<ブロッククオート非常にシンプルな PagerAdapter は、ページビュー自体をキーオブジェクトとして使用し、作成後に instantiateItem(ViewGroup, int) からそれらを返し、それらを親 ViewGroup に追加することを選択するかもしれません。一致する destroyItem(ViewGroup, int, Object) の実装は、親 ViewGroup から View を削除し、 isViewFromObject(View, Object) は、 return view == object; として実装することができます。
ということで、私の結論は
ViewPager
の子プロセスを明示的に追加/削除するには、その基礎となるアダプタに依存します。
instantiateItem()
/
destroyItem()
. つまり、もしあなたのアダプタが
PagerAdapter
のサブクラスである場合、サブクラスはこのロジックを実装しなければなりません。
補足: 注意すべきは
この
の中でリストを使っている場合は
ViewPager
.
関連
-
[解決済み】IllegalStateException: ViewPager で onSaveInstanceState の後にこのアクションを実行できません。
-
[解決済み] Androidのリストビューをスクロールビュー内に表示する
-
[解決済み] ViewPager PagerAdapter がビューを更新しない
-
[解決済み】FragmentPagerAdapterとFragmentStatePagerAdapterの違いは何ですか?
-
[解決済み] ViewPagerの一部であるListFragmentのデータを更新する
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] Gmailの3分割アニメーションシナリオの完全動作サンプル?
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] キャンバスに複数行のテキストを描画する
-
[解決済み] google-services.jsonって実際何してるの?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ViewPager PagerAdapter がビューを更新しない
-
[解決済み】ViewPagerを動的に更新しますか?
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] AndroidでラジオボタンにOnClickListenerを設定するには?
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?