2

I want to want to make ViewPager with each tab containing three fragments. FragmentPagerAdapter only works for one fragment, so I tried my best to make my own custom adapter extending PagerAdapter. Unfortunately, the code I wrote only displays these three Fragments in the first tab and after restarting the app all tabs are blank. I suspect that it has something to do with onSaveInstanceState, but I don't know how to make it properly. Also, I've read that I shouldn't add the fragments to FragmentTransaction in instantiateItem, but I don't know where else I could do it. Could you help me ?

TaskListPagerActivity:

public class TaskListPagerActivity extends AppCompatActivity implements BottomPanelFragment.OnBottomPanelSelectedListener {
private static final String TAG = "TaskListPagerActivity";

private ViewPager mViewPager;

FragmentStacker[] mStacker;

public static Intent newInstance(Context packageContext) {
    Intent intent = new Intent(packageContext, TaskListPagerActivity.class);
    return intent;
}


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_task_list_pager);

    mStacker = new FragmentStacker[7];

    mViewPager = (ViewPager) findViewById(R.id.activity_task_list_pager);

    mViewPager.setAdapter(new TaskListPagerAdapter(this));

}

// Interface methods

private class TaskListPagerAdapter extends PagerAdapter {
    private FragmentActivity mContext;

    public TaskListPagerAdapter(FragmentActivity context) {
        mContext = context;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment res;
        FragmentManager fm = mContext.getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();

        if (mStacker[position] == null) {
            mStacker[position] = new FragmentStacker();
            ft.add(container.getId(), mStacker[position]);
        } else {
            ft.attach(mStacker[position]);
        }



        res = mStacker[position];
        ft.commit();
        return res;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {

    }

    @Override
    public int getCount() {
        return 7;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return ((Fragment) object).getView()==view;
    }

}}

FragmentStacker:

public class FragmentStacker extends Fragment {

Fragment[] fragments = createFragments();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.task_list_activity_fragment, container, false);

    FragmentManager fm = getFragmentManager();
    Fragment customDateFragment = fm.findFragmentById(R.id.custom_date_fragment_container);
    Fragment taskListFragment = fm.findFragmentById(R.id.task_list_fragment_container);
    Fragment bottomPanelFragment = fm.findFragmentById(R.id.bottom_panel_container);

    FragmentTransaction fragmentTransaction = fm.beginTransaction();

    if (customDateFragment == null) {
        customDateFragment = fragments[0];
        taskListFragment = fragments[1];
        bottomPanelFragment = fragments[2];

        fragmentTransaction.add(R.id.custom_date_fragment_container, customDateFragment);
        fragmentTransaction.add(R.id.task_list_fragment_container, taskListFragment);
        fragmentTransaction.add(R.id.bottom_panel_container, bottomPanelFragment);
        fragmentTransaction.commit();
    } else {
        fragmentTransaction.attach(customDateFragment);
        fragmentTransaction.attach(taskListFragment);
        fragmentTransaction.attach(bottomPanelFragment);
    }
    return v;
}

private Fragment[] createFragments() {
    return new Fragment[]{new CustomDateFragment(), new TaskListFragment(), new BottomPanelFragment()};
}}
mzmyslowski
  • 121
  • 1
  • 2
  • 11

0 Answers0