Fragment ist null bei Verwendung von FragmentStatePagerAdapter

stimmen
0

Ich habe 3 untere Navigationsregisterkarten in meiner Anwendung

  • Startseite
  • MeineTour
  • Profil

In MyTour, benutze ich, MyTourFragmentdie 3 verschiedene Registerkarten haben

  • Ausstehend(0)
  • Erfolg(1)
  • Gescheitert(2)

Für alle drei Registerkarten (Ausstehend, Erfolg, Fehlgeschlagen), die ich verwende FragmentMyTourJobListund abhängig von der Bedingung, dass ich ausstehende oder erfolgreiche oder fehlgeschlagene Daten in allen drei Registerkarten anführe.

Problemdarstellung :

Wenn ich auf MyTourNavigationselement klicke, wird die Instanz Pending Fragment null und ich kann nur ein leeres Fragment sehen, aber wenn ich auf Erfolg oder Misserfolg klicke, kann ich Daten sehen. Daten in der Registerkarte Pending sind nur sichtbar, wenn ich von anderen Registerkarten zurückkomme, aber nicht zu Beginn.

Hier ist der MyTourFragment Code :

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());
    } 
}

}

Hier ist der Code für 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;
}

}

Alles funktioniert, aber wenn ich das erste Mal auf die Registerkarte Pendent gehe, dann funktioniert es nicht. Übersehe ich hier etwas?

FragmentMytourJobList hinzugefügt

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();

    }
}

}

Veröffentlicht am 24/05/2020 um 14:06
quelle vom benutzer
In anderen Sprachen...                            

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