-1

I 'm using FragmentPagerAdapter to adapt fragments inside viewPager. I wrote code and It's working correctly ,Here is a my code

    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;
    }

}

I'm calling this adapter like this.

   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) {

        }
    });

Here is a my child fragment code

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();

}

} I try to explain my problem. As I said viewpager working perfect but when I viewPager has started ,both child fragment has launched (In log,I can show viewVisibility twice ). Is a any way print only one times, when page is a current page?

BekaKK
  • 2,173
  • 6
  • 42
  • 80

1 Answers1

0

ViewPageris prepared for swipe capabilities. Therefore, he needs at least 1 more OFF screen page to be ready for this. So, the solution would be to do pager.setOffscreenPageLimit(0), but this is not possible, the lowest page limit size is 1. If you need to do something on the first page before showing the second one, try another approach. For example, locking page from swipe till some conditions are validated.

Ferran
  • 1,442
  • 1
  • 6
  • 10