最近私のチームは、ViewPagerの別のページに切り替えるためにボタンをタップすると、そのページのフラグメントが元々何らかの理由でダミーフラグメントでしたが、実際のフラグメントに置き換えます。ViewPager setCurrentItemとdataSetChangedは次のフラグメントが連続して表示されない
最初に、ボタンをタップすると、setCurrentItem()
が呼び出されてターゲットページに切り替わります。
private void showTTGTab() {
mFragmentVp.setCurrentItem(2, false);
}
setCurrentItem()ViewPagerページの動きを知らせるために戻ってonPageSelected()
を呼び出すcasuingだろう、それは私たちが実際のフラグメントとしてダミーの断片を交換する場所でした。
@Override
public void onPageSelected(int position) {
if (position == 2) onTTGSelect();
}
private void onTTGSelect() {
if (mActualFramgnet == null) {
mActualFramgnet = new my actual fragment();
replaceToTTGFragment();
}
}
private void replaceToTTGFragment() {
mAdapter.removeFragment(my dummy fragment instance);
mAdapter.addFragment(my actual fragment, 2);
mAdapter.notifyDataSetChanged();
}
ViewPagerは現在表示するなど、ブランク、何も表示されません。
我々はdataSetChanged()
このた後onLayoutは、最後の位置を確定したときに、位置決めメッセージを印刷し、ViewPagerのソースコードをローカライズ:我々はViewPagerのscrollXは、2160(フラグメントあたり幅1080)、のどれだっ見る
Positioning #0 f=NewsFragment{42408810 #1} left=-1080 width=1080 currentScrollX=2160
Positioning #1 f=MeFragment{42408f70 #3} left=1080 width=1080 currentScrollX=2160
Positioning #2 f=TTGFragment{4242a610 #2} left=0 width=1080 currentScrollX=2160
Note : logs were modified and customized.
私たちの断片は目に見えないゾーンに入ります。
我々は(最後setCurrentItemそのアイテムへのトレースと把握がsetCurrentItem後の2160年にscrollToItem()
スクロールXある()、およびその後のレイアウは、スクロールせずにx = 0の位置を設定するために主要項目として#2断片を作っ)はそれをスクロールすることを望んでいた。
データセットが変更されると、呼び出されたばかりのsetCurrentItemが実現され、位置決め確定後に0,0にスクロールされますか?
私は問題を理解助けることに私のデモを公開し、それを見てみてください。
https://github.com/vince-styling/viewpager-concurrent-datasetchange