From 4eda47df4b6527ce9593be8ce63cbfea2e03527c Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 10 Apr 2013 19:56:17 +1000 Subject: [PATCH] Made fragments work properly. As this was my first experience with fragments, I didn't respect their lifecycle properly. I think this has solved the issue I was having, where recreating the app list fragments after it was destroid by Android caused them to stuff up. --- src/org/fdroid/fdroid/FDroid.java | 15 ++++++---- .../views/AppListFragmentPageAdapter.java | 28 ++++++------------- src/org/fdroid/fdroid/views/AppListView.java | 9 ++++++ .../views/fragments/AppListFragment.java | 14 ++++++++++ .../fragments/AvailableAppsFragment.java | 14 ++++++++++ .../fragments/CanUpdateAppsFragment.java | 14 ++++++++++ .../fragments/InstalledAppsFragment.java | 14 ++++++++++ 7 files changed, 83 insertions(+), 25 deletions(-) create mode 100644 src/org/fdroid/fdroid/views/fragments/AppListFragment.java create mode 100644 src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java create mode 100644 src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java create mode 100644 src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java diff --git a/src/org/fdroid/fdroid/FDroid.java b/src/org/fdroid/fdroid/FDroid.java index 4af2bf571..ae25a1b9f 100644 --- a/src/org/fdroid/fdroid/FDroid.java +++ b/src/org/fdroid/fdroid/FDroid.java @@ -29,6 +29,7 @@ import android.app.*; import android.os.Build; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; +import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.*; import android.widget.*; @@ -92,6 +93,7 @@ public class FDroid extends FragmentActivity implements OnItemClickListener, // Used by pre 3.0 devices which don't have an ActionBar... private TabHost tabHost; + private AppListFragmentPageAdapter viewPageAdapter; // The following getters // (availableAdapter/installedAdapter/canUpdateAdapter/categoriesAdapter) @@ -149,8 +151,8 @@ public class FDroid extends FragmentActivity implements OnItemClickListener, @Override protected void onStart() { - super.onStart(); populateLists(); + super.onStart(); } @Override @@ -281,7 +283,8 @@ public class FDroid extends FragmentActivity implements OnItemClickListener, private void createViews() { viewPager = (ViewPager)findViewById(R.id.main_pager); - viewPager.setAdapter(new AppListFragmentPageAdapter(this)); + viewPageAdapter = new AppListFragmentPageAdapter(this); + viewPager.setAdapter(viewPageAdapter); viewPager.setOnPageChangeListener( new ViewPager.SimpleOnPageChangeListener() { public void onPageSelected(int position) { selectTab(position); @@ -593,13 +596,15 @@ public class FDroid extends FragmentActivity implements OnItemClickListener, public void onItemClick(AdapterView arg0, View arg1, final int arg2, long arg3) { - Fragment fragment = ((AppListFragmentPageAdapter)viewPager.getAdapter()).getItem(viewPager.getCurrentItem()); + int currentItem = viewPager.getCurrentItem(); + Fragment fragment = viewPageAdapter.getItem(currentItem); // The fragment.getView() returns a wrapper object which has the // actual view we're interested in inside: // http://stackoverflow.com/a/13684505 - AppListView view = ((AppListView)((ViewGroup)fragment.getView()).getChildAt(0)); - final DB.App app = (DB.App)view.getAppList().getAdapter().getItem(arg2); + ViewGroup group = (ViewGroup)fragment.getView(); + AppListView view = (AppListView)group.getChildAt(0); + final DB.App app = (DB.App)view.getAppList(). getAdapter().getItem(arg2); Intent intent = new Intent(this, AppDetails.class); intent.putExtra("appid", app.id); diff --git a/src/org/fdroid/fdroid/views/AppListFragmentPageAdapter.java b/src/org/fdroid/fdroid/views/AppListFragmentPageAdapter.java index b26e1f891..654f952e5 100644 --- a/src/org/fdroid/fdroid/views/AppListFragmentPageAdapter.java +++ b/src/org/fdroid/fdroid/views/AppListFragmentPageAdapter.java @@ -1,13 +1,18 @@ package org.fdroid.fdroid.views; import android.os.Bundle; +import android.os.Parcelable; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.fdroid.fdroid.FDroid; import org.fdroid.fdroid.R; +import org.fdroid.fdroid.views.fragments.AvailableAppsFragment; +import org.fdroid.fdroid.views.fragments.CanUpdateAppsFragment; +import org.fdroid.fdroid.views.fragments.InstalledAppsFragment; /** * Used by the FDroid activity in conjunction with its ViewPager to support @@ -19,28 +24,11 @@ public class AppListFragmentPageAdapter extends FragmentPagerAdapter { private Fragment[] fragments = new Fragment[3]; public AppListFragmentPageAdapter(FDroid parent) { - super(parent.getSupportFragmentManager()); this.parent = parent; - final AppListViewFactory viewFactory = new AppListViewFactory(parent); - - fragments[0] = new Fragment() { - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return viewFactory.createAvailableView(); - } - }; - - fragments[1] = new Fragment() { - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return viewFactory.createInstalledView(); - } - }; - - fragments[2] = new Fragment() { - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return viewFactory.createCanUpdateView(); - } - }; + fragments[0] = new AvailableAppsFragment(); + fragments[1] = new InstalledAppsFragment(); + fragments[2] = new CanUpdateAppsFragment(); } @Override diff --git a/src/org/fdroid/fdroid/views/AppListView.java b/src/org/fdroid/fdroid/views/AppListView.java index c1b1f9272..4fbe716ed 100644 --- a/src/org/fdroid/fdroid/views/AppListView.java +++ b/src/org/fdroid/fdroid/views/AppListView.java @@ -1,6 +1,7 @@ package org.fdroid.fdroid.views; import android.content.Context; +import android.util.AttributeSet; import android.widget.LinearLayout; import android.widget.ListView; @@ -22,6 +23,14 @@ public class AppListView extends LinearLayout { super(context); } + public AppListView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AppListView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + public void setAppList(ListView appList) { this.appList = appList; } diff --git a/src/org/fdroid/fdroid/views/fragments/AppListFragment.java b/src/org/fdroid/fdroid/views/fragments/AppListFragment.java new file mode 100644 index 000000000..f747b876a --- /dev/null +++ b/src/org/fdroid/fdroid/views/fragments/AppListFragment.java @@ -0,0 +1,14 @@ +package org.fdroid.fdroid.views.fragments; + +import android.support.v4.app.Fragment; +import org.fdroid.fdroid.FDroid; +import org.fdroid.fdroid.views.AppListViewFactory; + +public class AppListFragment extends Fragment { + + protected AppListViewFactory getViewFactory() { + FDroid parent = (FDroid)getActivity(); + return new AppListViewFactory(parent); + } + +} diff --git a/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java new file mode 100644 index 000000000..7379f33ef --- /dev/null +++ b/src/org/fdroid/fdroid/views/fragments/AvailableAppsFragment.java @@ -0,0 +1,14 @@ +package org.fdroid.fdroid.views.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class AvailableAppsFragment extends AppListFragment { + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return getViewFactory().createAvailableView(); + } + +} diff --git a/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java new file mode 100644 index 000000000..85849e601 --- /dev/null +++ b/src/org/fdroid/fdroid/views/fragments/CanUpdateAppsFragment.java @@ -0,0 +1,14 @@ +package org.fdroid.fdroid.views.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class CanUpdateAppsFragment extends AppListFragment { + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return getViewFactory().createCanUpdateView(); + } + +} diff --git a/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java new file mode 100644 index 000000000..fcf7cc9bc --- /dev/null +++ b/src/org/fdroid/fdroid/views/fragments/InstalledAppsFragment.java @@ -0,0 +1,14 @@ +package org.fdroid.fdroid.views.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +public class InstalledAppsFragment extends AppListFragment { + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return getViewFactory().createInstalledView(); + } + +}