ViewPager:没有附加适配器;跳绳布局; AndroidRuntime:java.lang.IllegalStateException:递归进入executePendingTransactions

问题描述:

enter image description hereViewPager:没有附加适配器;跳绳布局; AndroidRuntime:java.lang.IllegalStateException:递归进入executePendingTransactions

.... MoviesDetailsViewPagerAdapter是一个自定义适配器.........

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

... .....详情分片活动代码..........

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

    } 

面对这个问题..请帮我理解这一点。 我试过这个帖子中提到的解决方案: ViewPager: Recursive entry to executePendingTransactionsViewPager: Recursive entry to executePendingTransactions

+0

删除通话要通知DataSetChanged() –

+0

@DanielNugent那么适配器将如何才能了解数据更改?? – PN10

+0

@DanielNugent kkk ..我正在使用v4:23.2.0支持库..我可以做什么? – PN10

看起来主要的问题是你使用FragmentManager而不是Fragment。而不是getActivity().getSupportFragmentManager(),请使用getChildFragmentManager()

注意,你要么需要您分钟SDK设置为17或更高,或者如果你需要的目标较低分钟SDK使用支持库片段(import android.support.v4.app.Fragment而不是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); 
    } 
+0

虽然日志更改为他们是没有IllegalStateException的错误,但仍然我的应用程序crashing.and这是在我的logcat E/RecyclerView:没有适配器连接;跳过layout.One更多的事情我是在调试时我在自定义适配器中丢失了一些东西,我在这个Statement中找到了循环:DetailsFragmentActivity detailsFragmentActivity = new DetailsFragmentActivity(); – PN10

+0

非常感谢。我试图解决这个问题,因为天..但E/RecyclerView:没有适配器连接;跳过布局。也是早些时候也到了,它还没有消失。我也提出了这个问题。无论如何,我将标记为解决方案。 – PN10

+0

@ PN10如果你对'没有连接适配器'的问题开放一个新的问题,请在这里的评论中链接到它,当我有时间时我会看看!我只是再看看你的代码,我没有看到任何明显的问题。 –