Fragment est nul lors de l'utilisation de FragmentStatePagerAdapter

voix
0

J'ai 3 onglets de navigation en bas de ma candidature

  • Accueil
  • MyTour
  • Profil

Dans MyTour, j'utilise MyTourFragmentdes onglets qui ont 3 différents

  • En cours(0)
  • Succès(1)
  • Echec(2)

Pour les trois onglets (En attente, Réussite, Échec), j'utilise FragmentMyTourJobListet dépend de la condition dans laquelle j'affiche les données en attente ou de réussite ou d'échec dans les trois onglets.

Problématique :

Lorsque je clique sur l'élément de MyTournavigation, l'instance Pending Fragment devient nulle et je ne peux voir qu'un fragment vide, mais si je clique pour réussir ou échouer, alors je peux voir des données. Les données des onglets en attente ne sont visibles qu'après être revenues des autres onglets, mais pas au départ.

Voici le code de MyTourFragment :

public class MyTourFragment {

public MyTourFragment() {

}

public static MyTourFragment newInstance(MyTourFragmentListener myTourFragmentListener) {
    return new MyTourFragment(myTourFragmentListener);
}

private MyTourFragment(MyTourFragmentListener myTourFragmentListener) {
    this.mMyTourFragmentListener = myTourFragmentListener;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mViewModel.setNavigator(this);
    setHasOptionsMenu(true);

    //Get the Tab Id.
    Bundle bundle = this.getArguments();
    if (bundle != null) {
        mViewModel.setSelectedDateTimeMillis(bundle.getLong(todaysDateForMyTour, Calendar.getInstance().getTimeInMillis()));
        mSelectedTabId = bundle.getInt(KEY_SELECTED_TAB, 0);
    }

    mMyTourJobsListPagerAdapter = new MyTourJobsListPagerAdapter(this, mViewModel.getTourIdForSelectedDate(), this);

}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    mFragmentMyTourBinding = getViewDataBinding();

    mFragmentMyTourBinding.vpMyTour.setOffscreenPageLimit(2);
    mFragmentMyTourBinding.vpMyTour.setCurrentItem(0);
    mFragmentMyTourBinding.vpMyTour.setAdapter(mMyTourJobsListPagerAdapter);
    mFragmentMyTourBinding.tabLayoutMyTour.setupWithViewPager(mFragmentMyTourBinding.vpMyTour, true);
    mFragmentMyTourBinding.tabLayoutMyTour.addOnTabSelectedListener(this);

    setUpTabs();
}

private void setUpTabs() {

    //Select the current Tab.
    mFragmentMyTourBinding.vpMyTour.setCurrentItem(mSelectedTabId);

    //Refresh job list as per the selected date.
    FragmentMyTourJobsList fragmentMyTourJobsList = mMyTourJobsListPagerAdapter.getFragmentAtTab(mSelectedTabId); **// this is null first time**
    if (fragmentMyTourJobsList != null) {
        fragmentMyTourJobsList.refreshJobsList(mViewModel.getTourIdForSelectedDate());
    } 
}

}

Voici le code du MyTourJobsListPagerAdapter :

public class MyTourJobsListPagerAdapter extends FragmentStatePagerAdapter {

private static final int MY_TOUR_JOBS_LIST_PAGES_COUNT = 3;
private static final int POSITION_TAB_PENDING = 0;
private static final int POSITION_TAB_SUCCESS = 1;
private static final int POSITION_TAB_FAILED = 2;
private HashMap<Integer, FragmentMyTourJobsList> mTabsFragments = new HashMap<Integer, FragmentMyTourJobsList>();
private long mTourId;
private FragmentMyTourJobsList.FragmentMyTourJobsListListener mFragmentMyTourJobsListListener;

public MyTourJobsListPagerAdapter(Fragment fragment, long tourId, FragmentMyTourJobsList.FragmentMyTourJobsListListener fragmentMyTourJobsListListener) {
    super(fragment.getChildFragmentManager(), BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    this.mTourId = tourId;
    this.mFragmentMyTourJobsListListener = fragmentMyTourJobsListListener;
}

public void setTourId(long tourId) {
    this.mTourId = tourId;
}

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

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    mTabsFragments.put(position, (FragmentMyTourJobsList) fragment);
    return fragment;
}


@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    mTabsFragments.remove(position);
    super.destroyItem(container, position, object);
}

@Override
public Fragment getItem(int position) {
    FragmentMyTourJobsList fragmentMyTourJobsList;
    switch (position) {
        case POSITION_TAB_SUCCESS:
            fragmentMyTourJobsList = getFragmentWithBundle(Constants.JOB_STATUS_SUCCESSFUL);
            break;
        case POSITION_TAB_FAILED:
            fragmentMyTourJobsList = getFragmentWithBundle(Constants.JOB_STATUS_FAILED);
            break;
        case POSITION_TAB_PENDING:
        default:
            fragmentMyTourJobsList = getFragmentWithBundle(Constants.JOB_STATUS_ACCEPTED);
            break;

    }
    return fragmentMyTourJobsList;
}

public FragmentMyTourJobsList getFragmentAtTab(int tabPosition) {
    return mTabsFragments.get(tabPosition);
}

private FragmentMyTourJobsList getFragmentWithBundle(String jobsStatus) {
    FragmentMyTourJobsList fragmentToLoad = FragmentMyTourJobsList.newInstance();

    Bundle bundle = new Bundle();
    bundle.putString(FragmentMyTourJobsList.KEY_ARG_JOBS_STATUS, jobsStatus);
    bundle.putLong(FragmentMyTourJobsList.KEY_ARG_TOUR_ID, mTourId);
    bundle.putSerializable(FragmentMyTourJobsList.KEY_ARG_FRAGMENT_MY_TOUR_JOBS_LIST_LISTENER, mFragmentMyTourJobsListListener);

    fragmentToLoad.setArguments(bundle);

    return fragmentToLoad;
}

}

Tout fonctionne, mais quand je vais aller à l'onglet En attente la première fois, ça ne fonctionne pas. Il me manque quelque chose ici ?

Ajout d'un fragment à ma liste d'emplois

public class FragmentMyTourJobsList extends BaseFragment<FragmentMyTourJobsListBinding, MyTourJobsListViewModel> implements MyTourJobsListNavigator {

public static FragmentMyTourJobsList newInstance() {
    return new FragmentMyTourJobsList();
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mViewModel.setNavigator(this);

    Bundle bundle = this.getArguments();
    if (bundle != null) {
        mJobsStatus = bundle.getString(KEY_ARG_JOBS_STATUS);
        mTourId = bundle.getLong(KEY_ARG_TOUR_ID, 0);
    }
}

@Override
public int getBindingVariable() {
    return myTourJobsListViewModel;
}

@Override
public int getLayoutId() {
    return R.layout.fragment_my_tour_jobs_list;
}

@Override
public MyTourJobsListViewModel getViewModel() {
    mViewModel = ViewModelProviders.of(this, new ViewModelProviderFactory(Objects.requireNonNull(getActivity()).getApplication())).get(MyTourJobsListViewModel.class);
    return mViewModel;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    mFragmentMyTourJobsListBinding = getViewDataBinding();

    // fetch job list  from database
    ArrayList<JobUiModel> jobList = mViewModel.fetchJobs(mTourId, mJobsStatus);
    RecyclerView.LayoutManager rvLayoutManager = new LinearLayoutManager(getActivity());
    mFragmentMyTourJobsListBinding.rvMyTourJobs.setLayoutManager(rvLayoutManager);

    // initialize adapter
    mJobsListAdapter = new MyTourJobsListAdapter(getContext(), jobList, mJobsStatus);
    mFragmentMyTourJobsListBinding.rvMyTourJobs.setAdapter(mJobsListAdapter);
    mJobsListAdapter.setClickInterface(this);

    mFragmentMyTourJobsListBinding.rvMyTourJobs.addItemDecoration(new EndOffsetItemDecoration(CommonUtils.dpToPx(56)));
}

void refreshJobsList(long tourId) {

    if (tourId > 0) {
        mTourId = tourId;
        mViewModel.fetchJobs(tourId, mJobsStatus);
        // fetch job list  from database
        ArrayList<JobUiModel> jobList = mViewModel.fetchJobs(mTourId, mJobsStatus);
        mJobsListAdapter.setDataset(jobList);
        mJobsListAdapter.notifyDataSetChanged();


    } else {
        mJobsListAdapter.setDataset(null);
        mJobsListAdapter.notifyDataSetChanged();

    }
}

}

Créé 24/05/2020 à 14:06
source utilisateur
Dans d'autres langues...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more