0

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

回答

1

看起來主要的問題是你使用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如果你對'沒有連接適配器'的問題開放一個新的問題,請在這裏的評論中鏈接到它,當我有時間時我會看看!我只是再看看你的代碼,我沒有看到任何明顯的問題。 –

相關問題