FragmentPagerAdapter не работает внутри ViewPager - PullRequest
0 голосов
/ 08 апреля 2019

Я использую FragmentPagerAdapter для адаптации фрагментов внутри viewPager.Я написал код, и он работает правильно. Вот мой код

    public class SPStoryDetailsAdapter extends FragmentPagerAdapter {
    Context context;
    public ArrayList<SPStoryContents> storyContents;

    public SPStoryDetailsAdapter(ArrayList<SPStoryContents> storyContents, Context ctx, FragmentManager fm) {
        super(fm);
        context = ctx;
        this.storyContents = storyContents;
    }


    @Override
    public Fragment getItem(int position) {
        return SPStoryDetailsFragment.newInstance(storyContents.get(position));

    }

    @Override
    public int getCount() {
        return 2; // I just test it with two elements
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

}

Я называю этот адаптер следующим образом.

   pagerAdapter = new SPStoryDetailsAdapter(storyContents, this, getSupportFragmentManager());
    pager = findViewById(R.id.viewPager);

    pager.setAdapter(pagerAdapter);
    pager.setPageTransformer(true, new SPSimpleTransformation());

    pager.post(() -> pager.setCurrentItem(currentPagerIndex,false));
    pageIndicatorView = findViewById(R.id.pageIndicatorView);
    pageIndicatorView.attachToPager(pager);
    pageIndicatorView.setVisibleDotCount(5);
    pageIndicatorView.setVisibility(storyContents.size() > 1 ? View.VISIBLE : View.GONE);

    pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

Вот мой фрагмент кода дочернего элемента

public class SPStoryDetailsFragment extends Fragment {
private View view;

public static SPStoryDetailsFragment newInstance(SPStoryContents storyContents) {
    SPStoryDetailsFragment f = new SPStoryDetailsFragment();
    Bundle b = new Bundle();
    b.putSerializable("storyContent", storyContents);
    f.setArguments(b);
    return f;
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.sp_story_details_fragment, container, false);
    return view;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    SPLogger.logMassage("viewVisibility", "mediaType");

}


@Override
public void onStop() {
    super.onStop();
    SPLogger.logMassage("liveEvent", "onStop");
    if (youTubePlayerView != null) {
        youTubePlayerView.pauseYoutubeVideo();
    }
}


@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (!isVisibleToUser && isResumed()) {

        SPLogger.logMassage("viewVisibility",
                youTubePlayerView == null ? "isNull" : "notNull2");
        SPLogger.logMassage("viewVisibility", "Call code when Fragment not visible");
        // Call code when Fragment not visible
    } else if (isVisibleToUser && isResumed()) {
        // Call code when Fragment becomes visible.
        SPLogger.logMassage("viewVisibility",
                youTubePlayerView == null ? "isNull" : "notNull");
        SPLogger.logMassage("viewVisibility", "Call code when Fragment becomes visible");

    }
    if (youTubePlayerView != null) {
        youTubePlayerView.pauseYoutubeVideo();
    }
    if (initializedYouTubePlayer != null)
        initializedYouTubePlayer.pause();

}

} Я пытаюсь объяснить мою проблему.Как я уже сказал, viewpager работает отлично, но когда я запускаю viewPager, запускается оба дочерних фрагмента (в журнале я могу дважды показать viewVisibility).Можно ли каким-либо образом печатать только один раз, когда страница является текущей страницей?

1 Ответ

0 голосов
/ 08 апреля 2019

ViewPager подготовлен для возможности салфетки.Следовательно, ему нужна еще как минимум 1 страница экрана выключения, чтобы быть готовым к этому.Таким образом, решение было бы сделать pager.setOffscreenPageLimit(0), но это невозможно, минимальный размер страницы ограничен 1. Если вам нужно что-то сделать на первой странице, прежде чем показывать вторую, попробуйте другой подход.Например, блокировка страницы от пролистывания до проверки некоторых условий.

...