Как обновить тот же экземпляр фрагмента, повторенный двенадцать раз - PullRequest
0 голосов
/ 02 сентября 2018

Я использую наблюдаемый шаблон для обновления моих 12 UpcomingGamesFragment фрагментов

Вот мой UpcomingGamesFragment класс с методом, который я вызываю для обновления

public class UpcomingGamesFragment extends Fragment implements Observer {

public void loadReleaseData(final int refresh) {
    if (mDatabaseLoading == null) {
        Log.d(TAG, "Fragment filter " + mFilter + " [fragment is null]");
        return;
    } else {
        Log.d(TAG, "Updating fragment: " + mFilter);
    }

    if (AppUtil.doesInternetWork(getActivity())) {
        // Viewpager does not load all fragments in memory, contents will be null
        mDatabaseLoading.setVisibility(View.VISIBLE);
        mUpcomingList.setVisibility(View.VISIBLE);
        mEmptyTextInfo.setVisibility(View.GONE);
        noInternetTxt.setVisibility(View.GONE);
        mUpcomingPageLayout.setClickable(false);

        Query query = mDatabaseRef.child("releases")
                .child(mRegion)
                .child("data")
                .orderByChild("m_y")
                .equalTo(mFilter);

        if (mFilter.equals("future")) {
            // Get all future releases
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MONTH, Calendar.getInstance().get(Calendar.MONTH));
            calendar.set(Calendar.YEAR, Calendar.getInstance().get(Calendar.YEAR) + 1);
            query = mDatabaseRef.child("releases")
                    .child(mRegion)
                    .child("data")
                    .orderByChild("date")
                    .startAt(calendar.getTimeInMillis());
        }

        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.hasChildren()) {
                    if (refresh == 1) {
                        // Toast.makeText(getContext(), "adasfsdz", Toast.LENGTH_SHORT).show();
                        resetList();
                        Toast.makeText(getContext(), "Refreshing list...", Toast.LENGTH_SHORT).show();
                    }
                    for (DataSnapshot data : dataSnapshot.getChildren()) {
                        _Release release = data.getValue(_Release.class);
                        if (release != null) {
                            if (mSelectedPlatforms.isEmpty()) {
                                // No platform filter set add all releases!
                                if (release.getGame() != null) {
                                    mUpcomingReleases.add(release);
                                }
                            } else {
                                if (release.getGame() != null) {
                                    // If current platform is in ours shared pref of platforms
                                    if (!Collections.disjoint(release.getPlatform(), mSelectedPlatforms)) {
                                        mUpcomingReleases.add(release);
                                    }
                                }
                            }
                        }
                        mUpcomingGamesAdapter.notifyDataSetChanged();
                    }
                    // Check if list empty, if it is no releases matching platforms filter
                    if (mUpcomingReleases.isEmpty()) {
                        mEmptyTextInfo.setText("No releases found matching your platforms");
                        mEmptyTextInfo.setVisibility(View.VISIBLE);
                    }
                } else {
                    mEmptyTextInfo.setText("No releases found for this month");
                    mEmptyTextInfo.setVisibility(View.VISIBLE);
                }
                mDatabaseLoading.setVisibility(View.GONE);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                mDatabaseLoading.setVisibility(View.GONE);
            }
        });
    }
}

@Override
public void update() {
    loadReleaseData(0);
}
}

И у меня есть другой фрагмент UpcomingViewPagerFragment, который содержит viewpager, который содержит 12 фрагментов, этот фрагмент является наблюдаемым, вот он:

public class UpcomingViewPagerFragment extends Fragment implements Observable {
 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_upcoming_view_pager, container, false);
    // Viewpager
    mViewPager = view.findViewById(R.id.pager);
    mViewPager.setOffscreenPageLimit(3);
    // Get TabLayout from Main
    TabLayout tabLayout = ((MainActivity)getActivity()).mTabLayout;
    tabLayout.setupWithViewPager(mViewPager);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat monthFormatter = new SimpleDateFormat("MMMM");
    // Add 11 months [Maximum] to show the releases for the next year [14 fragments in total]
    // First page recently released [-1] gets the last month of the current month
    calendar.add(Calendar.MONTH, -1);
    for (int i = 0; i < 14; i++) {
        String title = monthFormatter.format(calendar.getTime()) + " " + calendar.get(Calendar.YEAR);
        String queryId = (calendar.get(Calendar.MONTH) + 1) + "_" + calendar.get(Calendar.YEAR);
        if (i == 13) {
            // the last one
            queryId = "future";
            title = "Near future";
        }
        UpcomingGamesFragment upcomingGamesFragment = new UpcomingGamesFragment();
        mSectionsPagerAdapter.addFragment(upcomingGamesFragment, title, queryId);
        calendar.add(Calendar.MONTH, 1);
        // Log.d(TAG, "Added fragment: " + title + " : " + queryId);
        // Adding observers
        this.addObserver(upcomingGamesFragment);
    }
    mViewPager.setAdapter(mSectionsPagerAdapter);
    // Because the first page will always be the recently released
    mViewPager.setCurrentItem(1, true);
    return view;
}

@Override
public void addObserver(Observer o) {
    mObserversList.add(o);
}

@Override
public void deleteObserver(Observer o) {
    mObserversList.remove(o);
}

@Override
public void notifyObservers() {
    for (Observer observer: mObserversList) {
        observer.update();
    }
}
}

Некоторый код был опущен для ясности, как конструктор по умолчанию для обоих фрагментов

И когда я вызываю метод для обновления всех 12 фрагментов notifyObervers() в моем MainActivity, я всегда получаю, что компонент mDatabaseLoading равен null (см. Метод loadReleasData()), поэтому видимые фрагменты Не обновляйтесь, есть идеи, почему компоненты всегда null?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...