【问题标题】:Viewpager within a Fragment , Recursive entry error片段内的 Viewpager ,递归输入错误
【发布时间】:2014-08-12 09:30:12
【问题描述】:

我在片段中有一个 Viewpager,效果很好,但是视图分页器内部的片段都是显示收藏夹的同一个类(WaterStationFragment),并且这个片段有一个复选框,当它被选中时片段位于 sqldatabase 的收藏夹表中。现在我尝试做的是取消选中复选框时从视图寻呼机中删除片段,但我一直收到同样的错误

    08-12 09:09:29.566    1411-1411/com.nemanjaa.vannstand.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.nemanjaa.vannstand.app, PID: 1411
java.lang.IllegalStateException: Recursive entry to executePendingTransactions
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1450)
        at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1931)
        at android.support.v4.app.Fragment.performDestroy(Fragment.java:1717)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
        at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1212)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:652)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
        at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:1931)
        at android.support.v4.app.Fragment.performDestroy(Fragment.java:1717)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
        at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1212)
        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:652)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478)
        at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
        at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:892)
        at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2819)
        at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
        at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
        at com.nemanjaa.vannstand.app.fragments.FavoritesFragment$CollectionPagerAdapter.removeWaterStation(FavoritesFragment.java:109)
        at com.nemanjaa.vannstand.app.fragments.FavoritesFragment.removePage(FavoritesFragment.java:53)
        at com.nemanjaa.vannstand.app.fragments.WaterStationFragment$2.onCheckedChanged(WaterStationFragment.java:77)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:127)
        at android.widget.CompoundButton.toggle(CompoundButton.java:87)
        at android.widget.CompoundButton.performClick(CompoundButton.java:99)
        at android.view.View$PerformClick.run(View.java:18422)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

我的最爱片段:

    public class FavoritesFragment extends Fragment {

ViewPager viewPager;
CollectionPagerAdapter mCollectionPagerAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.activity_favorites, container,false);
    getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
    mCollectionPagerAdapter = new CollectionPagerAdapter(getChildFragmentManager(),this);
    viewPager = (ViewPager) v.findViewById(R.id.pager);
    new setAdapterTask().execute();
    return v;

}

private class setAdapterTask extends AsyncTask<Void,Void,Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        viewPager.setAdapter(mCollectionPagerAdapter);
    }
}

public void removePage(WaterStation waterStation){
    //viewPager = null;
        this.mCollectionPagerAdapter.removeWaterStation(waterStation);

}

public CollectionPagerAdapter getmCollectionPagerAdapter() {
    return mCollectionPagerAdapter;
}

public class CollectionPagerAdapter extends FragmentStatePagerAdapter{
    DatabaseHandler dbHandler = new DatabaseHandler(getActivity().getBaseContext());
    List<WaterStation> inner;
    List<Fragment> fragmentsList;
    FavoritesFragment fragment;
    public CollectionPagerAdapter(FragmentManager fragmentManager, FavoritesFragment fragment){
        super(fragmentManager);
        inner = dbHandler.getAllFavorites();
        this.fragment = fragment;
        fragmentsList = new ArrayList<Fragment>();
        generateFrags();
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentsList.get(position);
    }

    private void generateFrags(){
        for(WaterStation waterStation : inner){
            fragmentsList.add(makeFragmentsFor(waterStation));
        }
    }

    private Fragment makeFragmentsFor(WaterStation waterStation){
        WaterStationFragment waterStationFragment = new WaterStationFragment();
        Bundle args = new Bundle();
        args.putSerializable("waterStation",waterStation);
        waterStationFragment.setArguments(args);
        waterStationFragment.setFragment(fragment);
        return waterStationFragment;
    }

    @Override
    public int getCount() {
        return inner.size();
    }

    @Override
    public int getItemPosition (Object object)
    {
        return POSITION_NONE;
    }

    public void removeWaterStation(WaterStation ws){
        int i = inner.indexOf(ws);
        inner.remove(ws);
        fragmentsList.remove(i);
        notifyDataSetChanged();
        dbHandler.removeFavorite(ws);
    }

    public void addWaterStation(WaterStation ws){
        inner.add(ws);
        notifyDataSetChanged();
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        FragmentManager manager = ((Fragment)object).getChildFragmentManager();
        android.support.v4.app.FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment)object);
        trans.commit();
        Log.v("DESTROYED","DEEEEEEESTROOOOOOOY");
    }
}

}

我已经尝试了所有我能找到的关于这个主题的方法

【问题讨论】:

    标签: android android-fragments android-viewpager fragment notifydatasetchanged


    【解决方案1】:

    尝试这样的构造函数:

    public CollectionPagerAdapter(android.support.v4.app.Fragment fragment)
    {
        super(fragment.getChildFragmentManager());
    
        // ...
    }
    

    希望对你有帮助

    【讨论】:

    • 刚试过这个,但它仍然给我同样的错误,它尝试递归条目
    • 记录显示调用了两次destroy方法,但只进入了点击区域一次
    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多