diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/MainViewAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/main/MainViewAdapter.java index 98c30d726..7731c89c3 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/main/MainViewAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/main/MainViewAdapter.java @@ -39,6 +39,22 @@ class MainViewAdapter extends RecyclerView.Adapter<MainViewController> { positionToId.put(4, R.id.settings); } + @Override + public void onViewDetachedFromWindow(MainViewController holder) { + long viewType = getItemId(holder.getAdapterPosition()); + if (viewType == R.id.updates) { + holder.unbindUpdates(); + } + } + + @Override + public void onViewAttachedToWindow(MainViewController holder) { + long viewType = getItemId(holder.getAdapterPosition()); + if (viewType == R.id.updates) { + holder.bindUpdates(); + } + } + @Override public MainViewController onCreateViewHolder(ViewGroup parent, int viewType) { MainViewController holder = createEmptyView(); diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/MainViewController.java b/app/src/main/java/org/fdroid/fdroid/views/main/MainViewController.java index b0a674ac3..e5e804c3b 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/main/MainViewController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/main/MainViewController.java @@ -1,6 +1,7 @@ package org.fdroid.fdroid.views.main; import android.content.Intent; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; @@ -24,6 +25,9 @@ class MainViewController extends RecyclerView.ViewHolder { private final AppCompatActivity activity; private final FrameLayout frame; + @Nullable + private UpdatesViewBinder updatesView = null; + MainViewController(AppCompatActivity activity, FrameLayout frame) { super(frame); this.activity = activity; @@ -41,7 +45,17 @@ class MainViewController extends RecyclerView.ViewHolder { * @see UpdatesViewBinder */ public void bindUpdates() { - new UpdatesViewBinder(activity, frame); + if (updatesView == null) { + updatesView = new UpdatesViewBinder(activity, frame); + } + + updatesView.bind(); + } + + public void unbindUpdates() { + if (updatesView != null) { + updatesView.unbind(); + } } /** diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java index e9cb56ab0..b144b957f 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesAdapter.java @@ -258,6 +258,10 @@ public class UpdatesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder LocalBroadcastManager.getInstance(activity).registerReceiver(receiverAppStatusChanges, filter); } + public void stopListeningForStatusUpdates() { + LocalBroadcastManager.getInstance(activity).unregisterReceiver(receiverAppStatusChanges); + } + private void onManyAppStatusesChanged(String reasonForChange) { switch (reasonForChange) { case AppUpdateStatusManager.REASON_UPDATES_AVAILABLE: diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesViewBinder.java b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesViewBinder.java index 9157099a7..c48f802dd 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesViewBinder.java +++ b/app/src/main/java/org/fdroid/fdroid/views/updates/UpdatesViewBinder.java @@ -10,17 +10,24 @@ import org.fdroid.fdroid.R; public class UpdatesViewBinder { + private final UpdatesAdapter adapter; + public UpdatesViewBinder(AppCompatActivity activity, FrameLayout parent) { View view = activity.getLayoutInflater().inflate(R.layout.main_tab_updates, parent, true); - UpdatesAdapter adapter = new UpdatesAdapter(activity); - - // TODO: Find the right time to stop listening for status updates. - adapter.listenForStatusUpdates(); + adapter = new UpdatesAdapter(activity); RecyclerView list = (RecyclerView) view.findViewById(R.id.list); list.setHasFixedSize(true); list.setLayoutManager(new LinearLayoutManager(activity)); list.setAdapter(adapter); } + + public void bind() { + adapter.listenForStatusUpdates(); + } + + public void unbind() { + adapter.stopListeningForStatusUpdates(); + } }