0

enter image description here

....MoviesDetailsViewPagerAdapter is a custom adapter.........

    package com.example.beetel.moviesApp.adapter;


    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentStatePagerAdapter;

    import com.example.beetel.moviesApp.DetailsFragmentActivity;
    import com.example.beetel.moviesApp.ReviewsFragment;
    import com.example.beetel.moviesApp.TrailerFragment;
    import com.example.beetel.moviesApp.data.model.MovieResultListModel;
    import com.example.beetel.moviesApp.utilities.MovieAPIUtility;

/**
 * Created by beetel on 7/03/2016.
 */
public class MoviesDetailsViewPagerAdapter extends FragmentStatePagerAdapter {
    private MovieResultListModel.ResultModel resultModel;
    public MoviesDetailsViewPagerAdapter(FragmentManager fm,MovieResultListModel.ResultModel model)
    {
        super(fm);
        this.resultModel=model;
    }

    @Override
    public int getCount() {
        return MovieAPIUtility.TABS_MOVIE_DETAIL.length;
    }

    @Override
    public int getItemPosition(Object object)
    {
        return POSITION_NONE;
    }
    @Override
    public Fragment getItem(int pos)
    {
        switch (pos)
        {
            case 0:
               DetailsFragmentActivity detailsFragmentActivity=new DetailsFragmentActivity();
                Bundle arg=new Bundle();
                arg.putParcelable(MovieAPIUtility.EXTRA_DETAIL_FRAGMENT, resultModel);
                detailsFragmentActivity.setArguments(arg);
                return detailsFragmentActivity;

            case 1:
                TrailerFragment trailerFragment=new TrailerFragment();
                Bundle bundle=new Bundle();
                bundle.putParcelable(MovieAPIUtility.EXTRA_TRAILER_FRAGMENT, resultModel);
                trailerFragment.setArguments(bundle);
                return trailerFragment;
            case 2:
                ReviewsFragment reviewsFragment=new ReviewsFragment();
                Bundle args=new Bundle();
                args.putParcelable(MovieAPIUtility.EXTRA_REVIEW_FRAGMENT, resultModel);
                reviewsFragment.setArguments(args);
                return reviewsFragment;
            default:
                return new Fragment();
        }
    }

    @Override
    public CharSequence getPageTitle(int position ){
        if (position>=0&& position<MovieAPIUtility.TABS_MOVIE_DETAIL.length)
        {
            return MovieAPIUtility.TABS_MOVIE_DETAIL[position];
        }
        return null;
    }
}

........DetailsFragmentActivity code..........

  package com.example.beetel.moviesApp;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.example.beetel.moviesApp.adapter.MoviesDetailsViewPagerAdapter;
import com.example.beetel.moviesApp.data.model.MovieResultListModel;
import com.example.beetel.moviesApp.utilities.MovieAPIUtility;

import butterknife.ButterKnife;

/**
 * Created by beetel on 4/03/2016.
 */
public class DetailsFragmentActivity extends Fragment {
    ImageView imgPoster;

    private MovieResultListModel.ResultModel model;
    private ViewPager viewPager;
    private TabLayout tabLayout;

    private boolean fromactivity=true;
    private boolean twoPane=false;
    public DetailsFragmentActivity(){}
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Toolbar toolbar2 = (Toolbar) getActivity().findViewById(R.id.toolbar_movie_detail);
        imgPoster = (ImageView) getActivity().findViewById(R.id.toolbar_image_backdrop);
        if (getActivity().findViewById(R.id.multipan) != null) {
            twoPane = true;
            toolbar2.setTitle(model.getOriginalTitle());
        }
        if (!twoPane)

            ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(model.getOriginalTitle());
            try {
                setViewpagerAndBackDrop();
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState)
    {
        View view=inflater.inflate(R.layout.movie_fragment_main,container,false);
        ButterKnife.bind(this,view);

        model=getActivity().getIntent().getParcelableExtra(MovieAPIUtility.EXTRA_RESULT_MODEL);

        if(model==null){
            model=this.getArguments().getParcelable(MovieAPIUtility.EXTRA_RESULT_MODEL);
            fromactivity=false;

        }
        return view;
    }
  private void setViewpagerAndBackDrop()
    {
        viewPager=(ViewPager)getActivity().findViewById(R.id.vp_movie_detail);
        tabLayout=(TabLayout)getActivity().findViewById(R.id.tabs);
        //FragmentManager fragmentManager=this.getFragmentManager();
        MoviesDetailsViewPagerAdapter pagerAdapter=new MoviesDetailsViewPagerAdapter(getActivity().getSupportFragmentManager(),model);
        pagerAdapter.notifyDataSetChanged();

        viewPager.setAdapter(pagerAdapter);
        tabLayout.setupWithViewPager(viewPager);

        Glide.with(DetailsFragmentActivity.this)
                .load(MovieAPIUtility.URL_IMAGE_BACKDROP_BASE+model.getBackdropUrl())
                .error(R.drawable.poster)
                .centerCrop()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(imgPoster);
    }

    }

Facing this issue..Please help me understand this. I've tried the solution mentioned on this post : ViewPager: Recursive entry to executePendingTransactionsViewPager: Recursive entry to executePendingTransactions.

Community
  • 1
  • 1
PN10
  • 1,888
  • 3
  • 23
  • 34

1 Answers1

1

It looks like the main issue is that you're using the FragmentManager for the Activity instead of the Fragment. Instead of getActivity().getSupportFragmentManager(), use getChildFragmentManager().

Note that you'll either need to set your min sdk to 17 or higher, or if you need to target a lower min sdk use support library Fragments (import android.support.v4.app.Fragment instead of import android.app.Fragment.

private void setViewpagerAndBackDrop()
  {
    viewPager=(ViewPager)getActivity().findViewById(R.id.vp_movie_detail);
    tabLayout=(TabLayout)getActivity().findViewById(R.id.tabs);
    //FragmentManager fragmentManager=this.getFragmentManager();

    //use getChildFragmentManager() instead of getActivity().getChildFragmentManager():
    MoviesDetailsViewPagerAdapter pagerAdapter=new MoviesDetailsViewPagerAdapter(getChildFragmentManager(),model);

    //Don't call this here, only call notifyDataSetChanged() 
    //if the data source changes
    //after the initial call to setAdapter()
    //pagerAdapter.notifyDataSetChanged();

    viewPager.setAdapter(pagerAdapter);
    tabLayout.setupWithViewPager(viewPager);

    Glide.with(DetailsFragmentActivity.this)
      .load(MovieAPIUtility.URL_IMAGE_BACKDROP_BASE+model.getBackdropUrl())
      .error(R.drawable.poster)
      .centerCrop()
      .diskCacheStrategy(DiskCacheStrategy.ALL)
      .into(imgPoster);
  }
Daniel Nugent
  • 43,104
  • 15
  • 109
  • 137
  • Though the log is changed as their is no error of IllegalStateException but still my app is crashing.and this is coming in my logcat E/RecyclerView: No adapter attached; skipping layout.One more thing am i missing something in custom adapter as while debugging I found loops in this Statement: DetailsFragmentActivity detailsFragmentActivity=new DetailsFragmentActivity(); – PN10 Apr 03 '16 at 14:53
  • Thank you so much .I was trying to solve this since days..But E/RecyclerView: No adapter attached; skipping layout. was also coming earlier also it isn't gone yet.I put this also in question. Anyways i will marked as solution. – PN10 Apr 03 '16 at 15:05
  • @PN10 If you open up a new question for the `No adapter attached` issue, link to it in the comments here and I'll take a look when I have time! I just took a second look at your code, and I don't see anything obvious that would be causing that issue. – Daniel Nugent Apr 03 '16 at 15:08
  • @PN10 I did just notice one thing, there is no RecyclerView in any of your code in this question, so that error must be coming from somewhere else. Look for any area that you're using a RecyclerView in your code! – Daniel Nugent Apr 03 '16 at 15:11
  • Yes that was the case I was wondering where and why it's coming from ..sure and thanks again for the help. – PN10 Apr 03 '16 at 15:15
  • Don't know what happened after restarting android studio error is coming back the same error mentioned in question @DanielNugent – PN10 Apr 03 '16 at 19:43
  • Be sure to make sure your changes are saved, and be sure to do a clean and rebuild – Daniel Nugent Apr 03 '16 at 20:00