Crosswind
Crosswind

Reputation: 1045

android - global layout refresh function

EDIT 2: In my MainActivity I have a function (displayData) that displays the substitutions for my school.

public void displayData(List<Schoolday> results) {
    TabLayout mainTabLayout = (TabLayout) findViewById(R.id.mainTabLayout);
    ViewPager mainViewPager = (ViewPager) findViewById(R.id.mainViewPager);

    // draw the tabs depending on the days from the file
    mainTabLayout.removeAllTabs();
    for (int n = 0; n < results.size(); n++) {
        List<Subject> subjectsToDisplay = new ArrayList<>();
        if (myPreferences.getBoolean(SHOW_WHOLE_PLAN, true)) {
            subjectsToDisplay = results.get(n).getSubjects();
        } else {
            List<Subject> tempSubjectsToDisplay;
            tempSubjectsToDisplay = results.get(n).getSubjects();
            for (int i = 0; i < tempSubjectsToDisplay.size(); i++) {
                if (tempSubjectsToDisplay.get(i).getCourse().contains(myPreferences.getString(CLASS_TO_SHOW, "None"))) {
                    subjectsToDisplay.add(tempSubjectsToDisplay.get(i));
                }
            }
        }
        results.get(n).setSubjects(subjectsToDisplay);

        // only create a tab if there's any information to show within that tab
        if (results.get(n).getSubjects().size() > 0) {
            mainTabLayout.addTab(mainTabLayout.newTab().setText(results.get(n).getDate().substring(0, 6)));
        }
    }

    PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(), mainTabLayout.getTabCount(), results);
    mainViewPager.setAdapter(pagerAdapter);
    mainViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mainTabLayout));
    mainTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            mainViewPager.setCurrentItem(tab.getPosition());

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}

This is my main layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<android.support.design.widget.TabLayout
    android:id="@+id/mainTabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:elevation="6dp"
    android:minHeight="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:tabGravity="fill" />

<android.support.v4.view.ViewPager
    android:id="@+id/mainViewPager"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_below="@id/mainTabLayout" />
</RelativeLayout>

And this is the layout of the fragment that represents a page in the ViewPager:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/mainSwipeContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/mainRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />
</android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>

Whenever a refresh is triggered by the SwipeRefreshLayout I need the function displayData to be called. How can I call this function since the call comes from within a fragment/page from the ViewPager and displayData is not static?

Old question: I've been searching around quite a while but couldn't find an answer. Maybe I've searched for the wrong thing - just pointing me to that would already help.

My project (Vertretungsplan on github) displays the substitution plan for my school which is available to view/download as an xml file (xml file from school website). I then display the data in my app. I have a TabLayout (different tabs represent different days) and a connected ViewPager. Each page is using a fragment. Each fragment includes a RecyclerView (to display the results) which is wrapped in a SwipeRefreshLayout. When I want to refresh the data with the SwipeRefreshLayout I need to download all the data again and then update all the pages as well as the TabLayout(a new day might have a been added so a new tab will be needed). Since my refresh happens inside a fragment but I'm referencing the TabLayout as well as the ViewPager from my MainActivity I have no clue how to properly access all the elements in order to update the content.

My idea was to set up a Broadcast to let my MainActivity know that it needs to refresh the page since it originally set up the whole layout but maybe there is a better solution for that?

I'm kinda new to stackoverflow so feel free to correct me in the way of asking things here! If there's anything other information you need just ask me! I appreciate your help!!

Upvotes: 0

Views: 155

Answers (1)

Jim
Jim

Reputation: 10288

There are a couple ways to implement what you are asking. The most direct way is to create an interface for the Activity that the Fragment uses. See the docs here:

http://developer.android.com/training/basics/fragments/communicating.html

The other option, which decouples the Fragment from the Activity (which some may see as an advantage) is to use an Intent. With that approach, you need to look into the onNewIntent method, as it is not obvious exactly how it works.

Either one should be fine, especially since you are exploring ideas at this point.

Upvotes: 1

Related Questions