Viewpager внутри фрагмента, ошибка рекурсивного ввода

У меня есть 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");
    }
}

}

Я перепробовал все, что мог найти по этой теме


person Nemanja Aksic    schedule 12.08.2014    source источник


Ответы (1)


попробуйте такой конструктор:

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

    // ...
}

Надеюсь, это поможет вам

person Tpec1k    schedule 12.08.2014
comment
Только что попробовал это, но все равно выдает ту же ошибку, что и рекурсивные записи. - person Nemanja Aksic; 12.08.2014
comment
Регистрация показывает, что он вызывает метод уничтожения дважды, но входит в область, по которой щелкнули, только один раз. - person Nemanja Aksic; 12.08.2014