【问题标题】:ViewPager: No adapter attached; skipping layout ;AndroidRuntime:java.lang.IllegalStateException: Recursive entry to executePendingTransactionsViewPager:没有附加适配器;跳过布局;AndroidRuntime:java.lang.IllegalStateException: 递归进入 executePendingTransactions
【发布时间】:2016-04-03 14:01:14
【问题描述】:

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

........DetailsFragmentActivity 代码............

  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.

【问题讨论】:

  • 去掉notifyDataSetChanged()的调用
  • @DanielNugent 那么适配器将如何了解数据更改??
  • @DanielNugent kkk.. 我正在使用 v4:23.2.0 支持库..我能做什么?

标签: android android-fragments android-studio android-viewpager


【解决方案1】:

看起来主要问题是您将 FragmentManager 用于 Activity 而不是 Fragment。代替getActivity().getSupportFragmentManager(),使用getChildFragmentManager()

请注意,您需要将 min sdk 设置为 17 或更高,或者如果您需要针对较低的 min sdk 使用支持库 Fragments(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);
  }

【讨论】:

  • 虽然日志已更改,因为它们没有 IllegalStateException 错误,但我的应用程序仍然崩溃。这出现在我的 logcat E/RecyclerView 中:未连接适配器;跳过布局。我在自定义适配器中缺少一些东西,因为在调试时我在这个语句中发现了循环:DetailsFragmentActivity detailsFragmentActivity=new DetailsFragmentActivity();
  • 非常感谢。我一直在努力解决这个问题。但是 E/RecyclerView:没有附加适配器;跳过布局。也早点来了,它还没有消失。我也提出了这个问题。无论如何,我将标记为解决方案。
  • @PN10 如果您针对No adapter attached 问题提出新问题,请在此处的 cmets 中链接到它,我有时间会看看!我只是再次查看了您的代码,但没有发现任何明显会导致该问题的内容。
  • @PN10 我只注意到一件事,在这个问题的任何代码中都没有 RecyclerView,所以这个错误一定来自其他地方。查找您在代码中使用 RecyclerView 的任何区域!
  • 是的,我想知道它来自哪里以及为什么来自..当然,再次感谢您的帮助。
猜你喜欢
  • 2021-09-19
  • 2018-06-12
  • 2021-12-19
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多