From db1f54c352ed768336ea64e00b84949f632690c8 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Tue, 5 Jan 2016 21:48:28 +1100 Subject: [PATCH] Create fragments appropriately in main view. The approach to creating fragments in the constructor of the `AppListFragmentPagerAdapter` was incorrect. Fragments are a special kind of magic, so this commit uses the approach documented at http://stackoverflow.com/a/15261142 to make sure that the correct fragment instances are always retrieved. Fixes #521. --- .../views/AppListFragmentPagerAdapter.java | 40 +++++++++++++------ .../views/fragments/AppListFragment.java | 8 ++-- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java b/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java index 7ce790d3c..9e9e47ea3 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java +++ b/F-Droid/src/org/fdroid/fdroid/views/AppListFragmentPagerAdapter.java @@ -4,6 +4,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; +import android.view.ViewGroup; import org.fdroid.fdroid.FDroid; import org.fdroid.fdroid.R; @@ -17,22 +18,34 @@ import org.fdroid.fdroid.views.fragments.InstalledAppsFragment; /** * Used by the FDroid activity in conjunction with its ViewPager to support * swiping of tabs for both old devices (< 3.0) and new devices. + * + * See http://stackoverflow.com/a/15261142 for how to obtain references + * to fragments in order to update them in response to search queries. */ public class AppListFragmentPagerAdapter extends FragmentPagerAdapter { @NonNull private final FDroid parent; + @Nullable private String searchQuery; - @NonNull private final AppListFragment availableFragment; - @NonNull private final AppListFragment installedFragment; - @NonNull private final AppListFragment canUpdateFragment; + private final AppListFragment[] registeredFragments = new AppListFragment[TabManager.INDEX_COUNT]; public AppListFragmentPagerAdapter(@NonNull FDroid parent) { super(parent.getSupportFragmentManager()); this.parent = parent; + } - availableFragment = new AvailableAppsFragment(); - installedFragment = new InstalledAppsFragment(); - canUpdateFragment = new CanUpdateAppsFragment(); + @Override + public Object instantiateItem(ViewGroup container, int position) { + AppListFragment fragment = (AppListFragment) super.instantiateItem(container, position); + fragment.updateSearchQuery(searchQuery); + registeredFragments[position] = fragment; + return fragment; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + registeredFragments[position] = null; + super.destroyItem(container, position, object); } private String getInstalledTabTitle() { @@ -46,20 +59,23 @@ public class AppListFragmentPagerAdapter extends FragmentPagerAdapter { } public void updateSearchQuery(@Nullable String query) { - availableFragment.updateSearchQuery(query); - installedFragment.updateSearchQuery(query); - canUpdateFragment.updateSearchQuery(query); + searchQuery = query; + for (AppListFragment fragment : registeredFragments) { + if (fragment != null) { + fragment.updateSearchQuery(query); + } + } } @Override public Fragment getItem(int i) { switch (i) { case TabManager.INDEX_AVAILABLE: - return availableFragment; + return new AvailableAppsFragment(); case TabManager.INDEX_INSTALLED: - return installedFragment; + return new InstalledAppsFragment(); default: - return canUpdateFragment; + return new CanUpdateAppsFragment(); } } diff --git a/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java b/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java index 708f94f81..e3e7fe7bd 100644 --- a/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java +++ b/F-Droid/src/org/fdroid/fdroid/views/fragments/AppListFragment.java @@ -207,9 +207,11 @@ public abstract class AppListFragment extends ListFragment implements } public void updateSearchQuery(@Nullable String query) { - searchQuery = query; - if (isAdded()) { - getLoaderManager().restartLoader(0, null, this); + if (!TextUtils.equals(query, searchQuery)) { + searchQuery = query; + if (isAdded()) { + getLoaderManager().restartLoader(0, null, this); + } } } }