Henry Gunawan
Henry Gunawan

Reputation: 942

Viewpager empty when opened second time

I'm creating an apps to create a Sales Order. It has 1 fragment to show list of Sales Orders (ListFragment), 1 fragment to show Sales Order's form (FormFragment) and inside, there is a viewpager which has 2 fragments: HeaderFragment and ItemsFragment. When I accessed it the first time, it works fine, header and items are showing the input fields. But when I accessed it the second time, header and items are empty.

Here is how I open FormFragment from ListFragment:

public class ListFragment extends Fragment {

    ListView listViewSO;
    Bundle bundle;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ((MainActivity)getActivity()).getSupportActionBar().setTitle("SO LIST");

        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_list_so, container, false);

        bundle = getArguments();

        listViewSO = root.findViewById(R.id.list_view_so);

        listViewSO.setOnItemClickListener(SOListItemClick);

        return root;

    }

    private AdapterView.OnItemClickListener SOListItemClick = new AdapterView.OnItemClickListener() 
    {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            SalesOrder salesOrder = (ListFragment.this).adapter.getItem(i);

            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            bundle.putParcelable("salesorder", salesOrder);

            FormFragment FormFragment = new FormFragment();
            FormFragment.setArguments(bundle);

            fragmentTransaction.replace(R.id.fragment_container, FormFragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    };
}

This is my FormFragment

public class FormFragment extends Fragment {
    Bundle bundle;
    SalesOrder salesorder;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ((MainActivity)getActivity()).getSupportActionBar().setTitle("EDIT SO");

        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_so_form, container, false);

       ((MainActivity)getActivity()).drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        ((MainActivity)getActivity()).toggle.setDrawerIndicatorEnabled(false);
        ((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        bundle = getArguments();
        salesorder = bundle.getParcelable("salesorder");

        viewPager = (ViewPager) root.findViewById(R.id.view_pager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) root.findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

        return root;
    }

    private void setupViewPager(ViewPager viewPager) {
        SectionsPageAdapter adapter = new SectionsPageAdapter(getActivity().getSupportFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
        adapter.addFragment(new HeaderFragment(), "Header");
        adapter.addFragment(new ItemFragment(), "Items");
        adapter.addBundle(bundle);
        viewPager.setAdapter(adapter);
    }
}

This is my adapter:

public class SectionsPageAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public SectionsPageAdapter(@NonNull FragmentManager fm, int behavior) {
        super(fm, behavior);
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    public void addBundle(Bundle bundle) {
        for(int i = 0; i < mFragmentList.size(); i++) {
            mFragmentList.get(i).setArguments(bundle);
        }
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }

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

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

And lastly, this is my HeaderFragment

public class VisitationSOHeaderFragment extends Fragment {

    Bundle bundle;
    SalesOrder salesorder;

    TextInputLayout textInputSoCode, textInputSoDate;
    ProgressBar loading;

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

        bundle = getArguments();
        salesorder = bundle.getParcelable("salesorder");

        loading = root.findViewById(R.id.loading);
        textInputSoCode = root.findViewById(R.id.text_input_so_code);
        textInputSoDate = root.findViewById(R.id.text_input_so_date);

        textInputSoCode.getEditText().setText(salesorder.getSoCode());
        textInputSoDate.getEditText().setText(salesorder.getSoDate());

        return root;
    }
}

How is it happen? Is there something wrong with the viewpager settings? Any help would be much appreciated.

Upvotes: 0

Views: 205

Answers (1)

art
art

Reputation: 1332

Do not use getActivity().getSupportFragmentManager() to get fragment manager for FragmentPagerAdapter. Just use getChildFragmentManager method instead.

Upvotes: 1

Related Questions