ViewPager:没有附加适配器;跳绳布局; AndroidRuntime:java.lang.IllegalStateException:递归进入executePendingTransactions
ViewPager:没有附加适配器;跳绳布局; 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。
看起来主要的问题是你使用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);
}
虽然日志更改为他们是没有IllegalStateException的错误,但仍然我的应用程序crashing.and这是在我的logcat E/RecyclerView:没有适配器连接;跳过layout.One更多的事情我是在调试时我在自定义适配器中丢失了一些东西,我在这个Statement中找到了循环:DetailsFragmentActivity detailsFragmentActivity = new DetailsFragmentActivity(); – PN10
非常感谢。我试图解决这个问题,因为天..但E/RecyclerView:没有适配器连接;跳过布局。也是早些时候也到了,它还没有消失。我也提出了这个问题。无论如何,我将标记为解决方案。 – PN10
@ PN10如果你对'没有连接适配器'的问题开放一个新的问题,请在这里的评论中链接到它,当我有时间时我会看看!我只是再看看你的代码,我没有看到任何明显的问题。 –
删除通话要通知DataSetChanged() –
@DanielNugent那么适配器将如何才能了解数据更改?? – PN10
@DanielNugent kkk ..我正在使用v4:23.2.0支持库..我可以做什么? – PN10